[...] > > The fact that RQ_BUSY is set doesn't mean that the various fields you > are sampling are valid or stable. > > I suggest you add add a counter to the rqstp which is incremented from > even to odd after parsing a request - including he v4 parsing needed to > have a sable ->opcnt - and then incremented from odd to even when the > request is complete. > Then this code samples the counter, skips the rqst if the counter is > even, and resamples the counter after collecting the data. If it has > changed, the drop the record. Hi Neil, thx for the review. Ack, I will look into it. > > > + > > + seq_printf(m, > > + "0x%08x 0x%08lx 0x%08x NFSv%d %s %016lld", > > + be32_to_cpu(rqstp->rq_xid), rqstp->rq_flags, > > + rqstp->rq_prog, rqstp->rq_vers, > > + svc_proc_name(rqstp), > > + ktime_to_us(rqstp->rq_stime)); > > + > > + if (rqstp->rq_addr.ss_family == AF_INET) > > + seq_printf(m, " %pI4 %pI4", > > + &((struct sockaddr_in *)&rqstp->rq_addr)->sin_addr, > > + &((struct sockaddr_in *)&rqstp->rq_daddr)->sin_addr); > > + else if (rqstp->rq_addr.ss_family == AF_INET6) > > + seq_printf(m, " %pI6 %pI6", > > + &((struct sockaddr_in6 *)&rqstp->rq_addr)->sin6_addr, > > + &((struct sockaddr_in6 *)&rqstp->rq_daddr)->sin6_addr); > > + else > > + seq_printf(m, " unknown:%hu unknown:%hu", > > + rqstp->rq_addr.ss_family, > > + rqstp->rq_daddr.ss_family); > > The above code looks a lot like svc_print_addr(). Can we use the same > code? Do they need to be different. ack, I will look into it. Regards, Lorenzo > > NeilBrown > > > > +#ifdef CONFIG_NFSD_V4 > > + if (rqstp->rq_vers == NFS4_VERSION && > > + rqstp->rq_proc == NFSPROC4_COMPOUND) { > > + /* NFSv4 compund */ > > + struct nfsd4_compoundargs *args = rqstp->rq_argp; > > + struct nfsd4_compoundres *resp = rqstp->rq_resp; > > + > > + while (resp->opcnt < args->opcnt) { > > + struct nfsd4_op *op = &args->ops[resp->opcnt++]; > > + > > + seq_printf(m, " %s%s", nfsd4_op_name(op->opnum), > > + resp->opcnt < args->opcnt ? ":" : ""); > > + } > > + } > > +#endif /* CONFIG_NFSD_V4 */ > > + seq_puts(m, "\n"); > > + } > > + } > > + > > + rcu_read_unlock(); > > + > > + return 0; > > +} > > + > > +/** > > + * nfsd_rpc_status_open - Atomically copy a write verifier > > + * @inode: entry inode pointer. > > + * @file: entry file pointer. > > + * > > + * This routine dumps pending RPC requests info queued into nfs server. > > + */ > > +int nfsd_rpc_status_open(struct inode *inode, struct file *file) > > +{ > > + struct nfsd_net *nn = net_generic(inode->i_sb->s_fs_info, nfsd_net_id); > > + > > + mutex_lock(&nfsd_mutex); > > + if (!nn->nfsd_serv) { > > + mutex_unlock(&nfsd_mutex); > > + return -ENODEV; > > + } > > + > > + svc_get(nn->nfsd_serv); > > + mutex_unlock(&nfsd_mutex); > > + > > + return single_open(file, nfsd_rpc_status_show, inode->i_private); > > +} > > diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c > > index 587811a002c9..44eac83b35a1 100644 > > --- a/net/sunrpc/svc.c > > +++ b/net/sunrpc/svc.c > > @@ -1629,7 +1629,7 @@ const char *svc_proc_name(const struct svc_rqst *rqstp) > > return rqstp->rq_procinfo->pc_name; > > return "unknown"; > > } > > - > > +EXPORT_SYMBOL_GPL(svc_proc_name); > > > > /** > > * svc_encode_result_payload - mark a range of bytes as a result payload > > -- > > 2.41.0 > > > > >
Attachment:
signature.asc
Description: PGP signature