Message ID | 20210416035226.53588-7-olga.kornievskaia@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | create sysfs files for changing IP address | expand |
On Thu, 2021-04-15 at 23:52 -0400, Olga Kornievskaia wrote: > From: Olga Kornievskaia <kolga@netapp.com> > > This is used to uniquely identify sunrpc multipath objects in /sys. > > Signed-off-by: Dan Aloni <dan@kernelim.com> > --- > 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); > } >
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); + 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); }