Skip to content

Commit 4521819

Browse files
committed
afs: Trace afs_server usage
Add a tracepoint (afs_server) to track the afs_server object usage count. Signed-off-by: David Howells <[email protected]>
1 parent 051d252 commit 4521819

File tree

8 files changed

+110
-21
lines changed

8 files changed

+110
-21
lines changed

fs/afs/callback.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ static struct afs_cb_interest *afs_create_interest(struct afs_server *server,
4848
refcount_set(&new->usage, 1);
4949
new->sb = vnode->vfs_inode.i_sb;
5050
new->vid = vnode->volume->vid;
51-
new->server = afs_get_server(server);
51+
new->server = afs_get_server(server, afs_server_trace_get_new_cbi);
5252
INIT_HLIST_NODE(&new->cb_vlink);
5353

5454
write_lock(&server->cb_break_lock);
@@ -195,7 +195,7 @@ void afs_put_cb_interest(struct afs_net *net, struct afs_cb_interest *cbi)
195195
write_unlock(&cbi->server->cb_break_lock);
196196
if (vi)
197197
kfree_rcu(vi, rcu);
198-
afs_put_server(net, cbi->server);
198+
afs_put_server(net, cbi->server, afs_server_trace_put_cbi);
199199
}
200200
kfree_rcu(cbi, rcu);
201201
}

fs/afs/cmservice.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,11 @@ static void SRXAFSCB_CallBack(struct work_struct *work)
260260
* server holds up change visibility till it receives our reply so as
261261
* to maintain cache coherency.
262262
*/
263-
if (call->server)
263+
if (call->server) {
264+
trace_afs_server(call->server, atomic_read(&call->server->usage),
265+
afs_server_trace_callback);
264266
afs_break_callbacks(call->server, call->count, call->request);
267+
}
265268

266269
afs_send_empty_reply(call);
267270
afs_put_call(call);

fs/afs/fsclient.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1915,7 +1915,7 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net,
19151915
return ERR_PTR(-ENOMEM);
19161916

19171917
call->key = key;
1918-
call->server = afs_get_server(server);
1918+
call->server = afs_get_server(server, afs_server_trace_get_caps);
19191919
call->server_index = server_index;
19201920
call->upgrade = true;
19211921
call->async = true;

fs/afs/internal.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ struct afs_server {
518518
atomic_t usage;
519519
u32 addr_version; /* Address list version */
520520
u32 cm_epoch; /* Server RxRPC epoch */
521+
unsigned int debug_id; /* Debugging ID for traces */
521522

522523
/* file service access */
523524
rwlock_t fs_lock; /* access lock */
@@ -1244,17 +1245,12 @@ extern void __exit afs_clean_up_permit_cache(void);
12441245
*/
12451246
extern spinlock_t afs_server_peer_lock;
12461247

1247-
static inline struct afs_server *afs_get_server(struct afs_server *server)
1248-
{
1249-
atomic_inc(&server->usage);
1250-
return server;
1251-
}
1252-
12531248
extern struct afs_server *afs_find_server(struct afs_net *,
12541249
const struct sockaddr_rxrpc *);
12551250
extern struct afs_server *afs_find_server_by_uuid(struct afs_net *, const uuid_t *);
12561251
extern struct afs_server *afs_lookup_server(struct afs_cell *, struct key *, const uuid_t *);
1257-
extern void afs_put_server(struct afs_net *, struct afs_server *);
1252+
extern struct afs_server *afs_get_server(struct afs_server *, enum afs_server_trace);
1253+
extern void afs_put_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
12581254
extern void afs_manage_servers(struct work_struct *);
12591255
extern void afs_servers_timer(struct timer_list *);
12601256
extern void __net_exit afs_purge_servers(struct afs_net *);

fs/afs/rxrpc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void afs_put_call(struct afs_call *call)
188188
if (call->type->destructor)
189189
call->type->destructor(call);
190190

191-
afs_put_server(call->net, call->server);
191+
afs_put_server(call->net, call->server, afs_server_trace_put_call);
192192
afs_put_cb_interest(call->net, call->cbi);
193193
afs_put_addrlist(call->alist);
194194
kfree(call->request);

fs/afs/server.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
static unsigned afs_server_gc_delay = 10; /* Server record timeout in seconds */
1919
static unsigned afs_server_update_delay = 30; /* Time till VLDB recheck in secs */
20+
static atomic_t afs_server_debug_id;
2021

2122
static 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

204205
exists:
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)) {

fs/afs/server_list.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ void afs_put_serverlist(struct afs_net *net, struct afs_server_list *slist)
2020
if (slist && refcount_dec_and_test(&slist->usage)) {
2121
for (i = 0; i < slist->nr_servers; i++) {
2222
afs_put_cb_interest(net, slist->servers[i].cb_interest);
23-
afs_put_server(net, slist->servers[i].server);
23+
afs_put_server(net, slist->servers[i].server,
24+
afs_server_trace_put_slist);
2425
}
2526
kfree(slist);
2627
}
@@ -71,7 +72,8 @@ struct afs_server_list *afs_alloc_server_list(struct afs_cell *cell,
7172
break;
7273
if (j < slist->nr_servers) {
7374
if (slist->servers[j].server == server) {
74-
afs_put_server(cell->net, server);
75+
afs_put_server(cell->net, server,
76+
afs_server_trace_put_slist_isort);
7577
continue;
7678
}
7779

include/trace/events/afs.h

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,26 @@ enum afs_call_trace {
3131
afs_call_trace_work,
3232
};
3333

34+
enum afs_server_trace {
35+
afs_server_trace_alloc,
36+
afs_server_trace_callback,
37+
afs_server_trace_destroy,
38+
afs_server_trace_free,
39+
afs_server_trace_gc,
40+
afs_server_trace_get_by_uuid,
41+
afs_server_trace_get_caps,
42+
afs_server_trace_get_install,
43+
afs_server_trace_get_new_cbi,
44+
afs_server_trace_give_up_cb,
45+
afs_server_trace_put_call,
46+
afs_server_trace_put_cbi,
47+
afs_server_trace_put_find_rsq,
48+
afs_server_trace_put_slist,
49+
afs_server_trace_put_slist_isort,
50+
afs_server_trace_put_uuid_rsq,
51+
afs_server_trace_update,
52+
};
53+
3454
enum afs_fs_operation {
3555
afs_FS_FetchData = 130, /* AFS Fetch file data */
3656
afs_FS_FetchACL = 131, /* AFS Fetch file ACL */
@@ -219,6 +239,25 @@ enum afs_cb_break_reason {
219239
EM(afs_call_trace_wake, "WAKE ") \
220240
E_(afs_call_trace_work, "WORK ")
221241

242+
#define afs_server_traces \
243+
EM(afs_server_trace_alloc, "ALLOC ") \
244+
EM(afs_server_trace_callback, "CALLBACK ") \
245+
EM(afs_server_trace_destroy, "DESTROY ") \
246+
EM(afs_server_trace_free, "FREE ") \
247+
EM(afs_server_trace_gc, "GC ") \
248+
EM(afs_server_trace_get_by_uuid, "GET uuid ") \
249+
EM(afs_server_trace_get_caps, "GET caps ") \
250+
EM(afs_server_trace_get_install, "GET inst ") \
251+
EM(afs_server_trace_get_new_cbi, "GET cbi ") \
252+
EM(afs_server_trace_give_up_cb, "giveup-cb") \
253+
EM(afs_server_trace_put_call, "PUT call ") \
254+
EM(afs_server_trace_put_cbi, "PUT cbi ") \
255+
EM(afs_server_trace_put_find_rsq, "PUT f-rsq") \
256+
EM(afs_server_trace_put_slist, "PUT slist") \
257+
EM(afs_server_trace_put_slist_isort, "PUT isort") \
258+
EM(afs_server_trace_put_uuid_rsq, "PUT u-req") \
259+
E_(afs_server_trace_update, "UPDATE")
260+
222261
#define afs_fs_operations \
223262
EM(afs_FS_FetchData, "FS.FetchData") \
224263
EM(afs_FS_FetchStatus, "FS.FetchStatus") \
@@ -404,6 +443,7 @@ enum afs_cb_break_reason {
404443
#define E_(a, b) TRACE_DEFINE_ENUM(a);
405444

406445
afs_call_traces;
446+
afs_server_traces;
407447
afs_fs_operations;
408448
afs_vl_operations;
409449
afs_edit_dir_ops;
@@ -1240,6 +1280,29 @@ TRACE_EVENT(afs_cb_miss,
12401280
__print_symbolic(__entry->reason, afs_cb_break_reasons))
12411281
);
12421282

1283+
TRACE_EVENT(afs_server,
1284+
TP_PROTO(struct afs_server *server, int usage, enum afs_server_trace reason),
1285+
1286+
TP_ARGS(server, usage, reason),
1287+
1288+
TP_STRUCT__entry(
1289+
__field(unsigned int, server )
1290+
__field(int, usage )
1291+
__field(int, reason )
1292+
),
1293+
1294+
TP_fast_assign(
1295+
__entry->server = server->debug_id;
1296+
__entry->usage = usage;
1297+
__entry->reason = reason;
1298+
),
1299+
1300+
TP_printk("s=%08x %s u=%d",
1301+
__entry->server,
1302+
__print_symbolic(__entry->reason, afs_server_traces),
1303+
__entry->usage)
1304+
);
1305+
12431306
#endif /* _TRACE_AFS_H */
12441307

12451308
/* This part must be outside protection */

0 commit comments

Comments
 (0)