On Thu, 2021-04-15 at 23:52 -0400, Olga Kornievskaia wrote: > From: Olga Kornievskaia <kolga@xxxxxxxxxx> > > This is used to uniquely identify sunrpc multipath objects in /sys. > > Signed-off-by: Dan Aloni <dan@xxxxxxxxxxxx> > --- > include/linux/sunrpc/xprtmultipath.h | 4 ++++ > net/sunrpc/sunrpc_syms.c | 1 + > net/sunrpc/xprtmultipath.c | 26 ++++++++++++++++++++++++++ > 3 files changed, 31 insertions(+) > > diff --git a/include/linux/sunrpc/xprtmultipath.h > b/include/linux/sunrpc/xprtmultipath.h > index c6cce3fbf29d..ef95a6f18ccf 100644 > --- a/include/linux/sunrpc/xprtmultipath.h > +++ b/include/linux/sunrpc/xprtmultipath.h > @@ -14,6 +14,7 @@ struct rpc_xprt_switch { > spinlock_t xps_lock; > struct kref xps_kref; > > + unsigned int xps_id; > unsigned int xps_nxprts; > unsigned int xps_nactive; > atomic_long_t xps_queuelen; > @@ -71,4 +72,7 @@ extern struct rpc_xprt *xprt_iter_get_next(struct > rpc_xprt_iter *xpi); > > extern bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps, > const struct sockaddr *sap); > + > +extern void xprt_multipath_cleanup_ids(void); > + > #endif > diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c > index b61b74c00483..691c0000e9ea 100644 > --- a/net/sunrpc/sunrpc_syms.c > +++ b/net/sunrpc/sunrpc_syms.c > @@ -134,6 +134,7 @@ cleanup_sunrpc(void) > rpc_sysfs_exit(); > rpc_cleanup_clids(); > xprt_cleanup_ids(); > + xprt_multipath_cleanup_ids(); > rpcauth_remove_module(); > cleanup_socket_xprt(); > svc_cleanup_xprt_sock(); > diff --git a/net/sunrpc/xprtmultipath.c b/net/sunrpc/xprtmultipath.c > index 78c075a68c04..b71dd95ad7de 100644 > --- a/net/sunrpc/xprtmultipath.c > +++ b/net/sunrpc/xprtmultipath.c > @@ -86,6 +86,30 @@ void rpc_xprt_switch_remove_xprt(struct > rpc_xprt_switch *xps, > xprt_put(xprt); > } > > +static DEFINE_IDA(rpc_xprtswitch_ids); > + > +void xprt_multipath_cleanup_ids(void) > +{ > + ida_destroy(&rpc_xprtswitch_ids); > +} > + > +static int xprt_switch_alloc_id(struct rpc_xprt_switch *xps) > +{ > + int id; > + > + id = ida_simple_get(&rpc_xprtswitch_ids, 0, 0, GFP_KERNEL); This really needs to use the same allocation mode as the caller in xprt_switch_alloc() > + if (id < 0) > + return id; > + > + xps->xps_id = id; > + return 0; > +} > + > +static void xprt_switch_free_id(struct rpc_xprt_switch *xps) > +{ > + ida_simple_remove(&rpc_xprtswitch_ids, xps->xps_id); > +} > + > /** > * xprt_switch_alloc - Allocate a new struct rpc_xprt_switch > * @xprt: pointer to struct rpc_xprt > @@ -103,6 +127,7 @@ struct rpc_xprt_switch *xprt_switch_alloc(struct > rpc_xprt *xprt, > if (xps != NULL) { > spin_lock_init(&xps->xps_lock); > kref_init(&xps->xps_kref); > + xprt_switch_alloc_id(xps); > xps->xps_nxprts = xps->xps_nactive = 0; > atomic_long_set(&xps->xps_queuelen, 0); > xps->xps_net = NULL; > @@ -136,6 +161,7 @@ static void xprt_switch_free(struct kref *kref) > struct rpc_xprt_switch, xps_kref); > > xprt_switch_free_entries(xps); > + xprt_switch_free_id(xps); > kfree_rcu(xps, xps_rcu); > } > -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx