Skip to content

Commit 5e7a27b

Browse files
authored
DLPX-95197 NFS_OPS analytics collector not working (#113)
PR URL: https://www.github.com/delphix/performance-diagnostics/pull/113
1 parent ed01dfb commit 5e7a27b

File tree

2 files changed

+68
-62
lines changed

2 files changed

+68
-62
lines changed

bpf/estat/nfs.c

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44
* SPDX-License-Identifier: GPL-2.0-or-later
55
*/
66

7+
struct bpf_wq {
8+
__u64 __opaque[2];
9+
} __attribute__((aligned(8)));
10+
711
#include <uapi/linux/ptrace.h>
812
#include <linux/bpf_common.h>
913
#include <uapi/linux/bpf.h>
1014
#include <linux/sunrpc/svc.h>
15+
#include <linux/nfs4.h>
1116

1217

1318
// nfsd4 definitions from fs/nfsd/xdr4.h
@@ -30,32 +35,29 @@ typedef struct {
3035
stateid_opaque_t si_opaque;
3136
} stateid_t;
3237

33-
typedef struct {
34-
stateid_t rd_stateid; /* request */
35-
u64 rd_offset; /* request */
36-
u32 rd_length; /* request */
37-
int rd_vlen;
38-
struct file *rd_filp;
39-
bool rd_tmp_file;
40-
41-
void *rd_rqstp; /* response */
42-
void *rd_fhp; /* response */
43-
} nfsd4_read;
44-
45-
#define NFS4_VERIFIER_SIZE 8
46-
typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
47-
48-
typedef struct {
49-
stateid_t wr_stateid; /* request */
50-
u64 wr_offset; /* request */
51-
u32 wr_stable_how; /* request */
52-
u32 wr_buflen; /* request */
53-
struct kvec wr_head;
54-
struct page **wr_pagelist; /* request */
55-
u32 wr_bytes_written; /* response */
56-
u32 wr_how_written; /* response */
57-
nfs4_verifier wr_verifier; /* response */
58-
} nfsd4_write;
38+
struct nfsd4_read {
39+
stateid_t rd_stateid; /* request */
40+
u64 rd_offset; /* request */
41+
u32 rd_length; /* request */
42+
int rd_vlen;
43+
struct nfsd_file *rd_nf;
44+
45+
struct svc_rqst *rd_rqstp; /* response */
46+
struct svc_fh *rd_fhp; /* response */
47+
u32 rd_eof; /* response */
48+
};
49+
50+
struct nfsd4_write {
51+
stateid_t wr_stateid; /* request */
52+
u64 wr_offset; /* request */
53+
u32 wr_stable_how; /* request */
54+
u32 wr_buflen; /* request */
55+
struct xdr_buf wr_payload; /* request */
56+
57+
u32 wr_bytes_written; /* response */
58+
u32 wr_how_written; /* response */
59+
nfs4_verifier wr_verifier; /* response */
60+
};
5961

6062
// Definitions for this script
6163
#define READ_STR "read"
@@ -131,7 +133,7 @@ nfsd3_write_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *fhp,
131133
// @@ kprobe|nfsd4_read|nfsd4_read_start
132134
int
133135
nfsd4_read_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *cstate,
134-
nfsd4_read *nfs_read)
136+
struct nfsd4_read *nfs_read)
135137
{
136138
u32 pid = bpf_get_current_pid_tgid();
137139
nfs_data_t data = {};
@@ -148,7 +150,7 @@ nfsd4_read_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *cstate,
148150
// @@ kprobe|nfsd4_write|nfsd4_write_start
149151
int
150152
nfsd4_write_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *cstate,
151-
nfsd4_write *nfs_write)
153+
struct nfsd4_write *nfs_write)
152154
{
153155
u32 pid = bpf_get_current_pid_tgid();
154156
nfs_data_t data = {};

bpf/stbtrace/nfs.st

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,16 @@ from bcchelper import BCCHelper # noqa: E402
2323
# BPF txg program
2424
bpf_text = '#include "' + base_dir + 'lib/bcc_helper.h' + '"\n'
2525
bpf_text += """
26+
27+
struct bpf_wq {
28+
__u64 __opaque[2];
29+
} __attribute__((aligned(8)));
30+
2631
#include <uapi/linux/ptrace.h>
2732
#include <linux/bpf_common.h>
2833
#include <uapi/linux/bpf.h>
2934
#include <linux/sunrpc/svc.h>
35+
#include <linux/nfs4.h>
3036

3137

3238
// nfsd4 definitions from fs/nfsd/xdr4.h
@@ -35,45 +41,43 @@ bpf_text += """
3541
#define bool int
3642

3743
typedef struct {
38-
u32 cl_boot;
39-
u32 cl_id;
44+
u32 cl_boot;
45+
u32 cl_id;
4046
} clientid_t;
4147

4248
typedef struct {
43-
clientid_t so_clid;
44-
u32 so_id;
49+
clientid_t so_clid;
50+
u32 so_id;
4551
} stateid_opaque_t;
4652

4753
typedef struct {
48-
u32 si_generation;
49-
stateid_opaque_t si_opaque;
54+
u32 si_generation;
55+
stateid_opaque_t si_opaque;
5056
} stateid_t;
5157

52-
typedef struct {
53-
stateid_t rd_stateid; /* request */
54-
u64 rd_offset; /* request */
55-
u32 rd_length; /* request */
56-
int rd_vlen;
57-
struct file *rd_filp;
58-
bool rd_tmp_file;
59-
void *rd_rqstp; /* response */
60-
void *rd_fhp; /* response */
61-
} nfsd4_read;
62-
63-
#define NFS4_VERIFIER_SIZE 8
64-
typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
65-
66-
typedef struct {
67-
stateid_t wr_stateid; /* request */
68-
u64 wr_offset; /* request */
69-
u32 wr_stable_how; /* request */
70-
u32 wr_buflen; /* request */
71-
struct kvec wr_head;
72-
struct page ** wr_pagelist; /* request */
73-
u32 wr_bytes_written; /* response */
74-
u32 wr_how_written; /* response */
75-
nfs4_verifier wr_verifier; /* response */
76-
} nfsd4_write;
58+
struct nfsd4_read {
59+
stateid_t rd_stateid; /* request */
60+
u64 rd_offset; /* request */
61+
u32 rd_length; /* request */
62+
int rd_vlen;
63+
struct nfsd_file *rd_nf;
64+
65+
struct svc_rqst *rd_rqstp; /* response */
66+
struct svc_fh *rd_fhp; /* response */
67+
u32 rd_eof; /* response */
68+
};
69+
70+
struct nfsd4_write {
71+
stateid_t wr_stateid; /* request */
72+
u64 wr_offset; /* request */
73+
u32 wr_stable_how; /* request */
74+
u32 wr_buflen; /* request */
75+
struct xdr_buf wr_payload; /* request */
76+
77+
u32 wr_bytes_written; /* response */
78+
u32 wr_how_written; /* response */
79+
nfs4_verifier wr_verifier; /* response */
80+
};
7781

7882
// Definitions for this script
7983
#define READ_STR "read"
@@ -151,7 +155,7 @@ int nfsd3_write_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *fhp,
151155
}
152156

153157
int nfsd4_read_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *cstate,
154-
nfsd4_read *nfs_read)
158+
struct nfsd4_read *nfs_read)
155159
{
156160
u32 pid = bpf_get_current_pid_tgid();
157161
nfs_data_t data = {};
@@ -166,7 +170,7 @@ int nfsd4_read_start(struct pt_regs *ctx, struct svc_rqst *rqstp, void *cstate,
166170
}
167171

168172
int nfsd4_write_start(struct pt_regs *ctx, struct svc_rqst *rqstp,
169-
void *cstate, nfsd4_write *nfs_write)
173+
void *cstate, struct nfsd4_write *nfs_write)
170174
{
171175
u32 pid = bpf_get_current_pid_tgid();
172176
nfs_data_t data = {};
@@ -286,7 +290,7 @@ int nfsd4_write_done(struct pt_regs *ctx)
286290
u64 ts = bpf_ktime_get_ns();
287291
u32 pid = bpf_get_current_pid_tgid();
288292
nfs_data_t *data = nfs_base_data.lookup(&pid);
289-
nfsd4_write nfs_write;
293+
struct nfsd4_write nfs_write;
290294

291295
if (data == 0) {
292296
return 0; // missed issue

0 commit comments

Comments
 (0)