1717
1818static unsigned afs_server_gc_delay = 10 ; /* Server record timeout in seconds */
1919static unsigned afs_server_update_delay = 30 ; /* Time till VLDB recheck in secs */
20+ static atomic_t afs_server_debug_id ;
2021
2122static void afs_inc_servers_outstanding (struct afs_net * net )
2223{
@@ -51,7 +52,7 @@ struct afs_server *afs_find_server(struct afs_net *net,
5152
5253 do {
5354 if (server )
54- afs_put_server (net , server );
55+ afs_put_server (net , server , afs_server_trace_put_find_rsq );
5556 server = NULL ;
5657 read_seqbegin_or_lock (& net -> fs_addr_lock , & seq );
5758
@@ -116,7 +117,7 @@ struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uu
116117 * changes.
117118 */
118119 if (server )
119- afs_put_server (net , server );
120+ afs_put_server (net , server , afs_server_trace_put_uuid_rsq );
120121 server = NULL ;
121122
122123 read_seqbegin_or_lock (& net -> fs_lock , & seq );
@@ -131,7 +132,7 @@ struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uu
131132 } else if (diff > 0 ) {
132133 p = p -> rb_right ;
133134 } else {
134- afs_get_server (server );
135+ afs_get_server (server , afs_server_trace_get_by_uuid );
135136 break ;
136137 }
137138
@@ -202,7 +203,7 @@ static struct afs_server *afs_install_server(struct afs_net *net,
202203 ret = 0 ;
203204
204205exists :
205- afs_get_server (server );
206+ afs_get_server (server , afs_server_trace_get_install );
206207 write_sequnlock (& net -> fs_lock );
207208 return server ;
208209}
@@ -223,6 +224,7 @@ static struct afs_server *afs_alloc_server(struct afs_net *net,
223224 goto enomem ;
224225
225226 atomic_set (& server -> usage , 1 );
227+ server -> debug_id = atomic_inc_return (& afs_server_debug_id );
226228 RCU_INIT_POINTER (server -> addresses , alist );
227229 server -> addr_version = alist -> version ;
228230 server -> uuid = * uuid ;
@@ -234,6 +236,7 @@ static struct afs_server *afs_alloc_server(struct afs_net *net,
234236 spin_lock_init (& server -> probe_lock );
235237
236238 afs_inc_servers_outstanding (net );
239+ trace_afs_server (server , 1 , afs_server_trace_alloc );
237240 _leave (" = %p" , server );
238241 return server ;
239242
@@ -328,10 +331,23 @@ void afs_servers_timer(struct timer_list *timer)
328331 afs_dec_servers_outstanding (net );
329332}
330333
334+ /*
335+ * Get a reference on a server object.
336+ */
337+ struct afs_server * afs_get_server (struct afs_server * server ,
338+ enum afs_server_trace reason )
339+ {
340+ unsigned int u = atomic_inc_return (& server -> usage );
341+
342+ trace_afs_server (server , u , reason );
343+ return server ;
344+ }
345+
331346/*
332347 * Release a reference on a server record.
333348 */
334- void afs_put_server (struct afs_net * net , struct afs_server * server )
349+ void afs_put_server (struct afs_net * net , struct afs_server * server ,
350+ enum afs_server_trace reason )
335351{
336352 unsigned int usage ;
337353
@@ -342,7 +358,7 @@ void afs_put_server(struct afs_net *net, struct afs_server *server)
342358
343359 usage = atomic_dec_return (& server -> usage );
344360
345- _enter ( "{%u}" , usage );
361+ trace_afs_server ( server , usage , reason );
346362
347363 if (likely (usage > 0 ))
348364 return ;
@@ -354,6 +370,8 @@ static void afs_server_rcu(struct rcu_head *rcu)
354370{
355371 struct afs_server * server = container_of (rcu , struct afs_server , rcu );
356372
373+ trace_afs_server (server , atomic_read (& server -> usage ),
374+ afs_server_trace_free );
357375 afs_put_addrlist (rcu_access_pointer (server -> addresses ));
358376 kfree (server );
359377}
@@ -369,14 +387,18 @@ static void afs_destroy_server(struct afs_net *net, struct afs_server *server)
369387 .index = alist -> preferred ,
370388 .error = 0 ,
371389 };
372- _enter ("%p" , server );
390+
391+ trace_afs_server (server , atomic_read (& server -> usage ),
392+ afs_server_trace_give_up_cb );
373393
374394 if (test_bit (AFS_SERVER_FL_MAY_HAVE_CB , & server -> flags ))
375395 afs_fs_give_up_all_callbacks (net , server , & ac , NULL );
376396
377397 wait_var_event (& server -> probe_outstanding ,
378398 atomic_read (& server -> probe_outstanding ) == 0 );
379399
400+ trace_afs_server (server , atomic_read (& server -> usage ),
401+ afs_server_trace_destroy );
380402 call_rcu (& server -> rcu , afs_server_rcu );
381403 afs_dec_servers_outstanding (net );
382404}
@@ -396,6 +418,7 @@ static void afs_gc_servers(struct afs_net *net, struct afs_server *gc_list)
396418 write_seqlock (& net -> fs_lock );
397419 usage = 1 ;
398420 deleted = atomic_try_cmpxchg (& server -> usage , & usage , 0 );
421+ trace_afs_server (server , usage , afs_server_trace_gc );
399422 if (deleted ) {
400423 rb_erase (& server -> uuid_rb , & net -> fs_servers );
401424 hlist_del_rcu (& server -> proc_link );
@@ -518,6 +541,8 @@ static noinline bool afs_update_server_record(struct afs_fs_cursor *fc, struct a
518541
519542 _enter ("" );
520543
544+ trace_afs_server (server , atomic_read (& server -> usage ), afs_server_trace_update );
545+
521546 alist = afs_vl_lookup_addrs (fc -> vnode -> volume -> cell , fc -> key ,
522547 & server -> uuid );
523548 if (IS_ERR (alist )) {
0 commit comments