sunrpc: add xprt id
authorOlga Kornievskaia <kolga@netapp.com>
Tue, 8 Jun 2021 19:59:13 +0000 (15:59 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 8 Jul 2021 18:03:23 +0000 (14:03 -0400)
This adds a unique identifier for a sunrpc transport in sysfs, which is
similarly managed to the unique IDs of clients.

Signed-off-by: Dan Aloni <dan@kernelim.com>
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
include/linux/sunrpc/xprt.h
net/sunrpc/sunrpc_syms.c
net/sunrpc/xprt.c

index 61b622e..1fbc470 100644 (file)
@@ -185,6 +185,7 @@ enum xprt_transports {
 struct rpc_xprt {
        struct kref             kref;           /* Reference count */
        const struct rpc_xprt_ops *ops;         /* transport methods */
+       unsigned int            id;             /* transport id */
 
        const struct rpc_timeout *timeout;      /* timeout parms */
        struct sockaddr_storage addr;           /* server address */
@@ -370,6 +371,7 @@ struct rpc_xprt *   xprt_alloc(struct net *net, size_t size,
 void                   xprt_free(struct rpc_xprt *);
 void                   xprt_add_backlog(struct rpc_xprt *xprt, struct rpc_task *task);
 bool                   xprt_wake_up_backlog(struct rpc_xprt *xprt, struct rpc_rqst *req);
+void                   xprt_cleanup_ids(void);
 
 static inline int
 xprt_enable_swap(struct rpc_xprt *xprt)
index 3b57efc..b61b74c 100644 (file)
@@ -133,6 +133,7 @@ cleanup_sunrpc(void)
 {
        rpc_sysfs_exit();
        rpc_cleanup_clids();
+       xprt_cleanup_ids();
        rpcauth_remove_module();
        cleanup_socket_xprt();
        svc_cleanup_xprt_sock();
index 3509a7f..20b9bd7 100644 (file)
@@ -1746,6 +1746,30 @@ static void xprt_free_all_slots(struct rpc_xprt *xprt)
        }
 }
 
+static DEFINE_IDA(rpc_xprt_ids);
+
+void xprt_cleanup_ids(void)
+{
+       ida_destroy(&rpc_xprt_ids);
+}
+
+static int xprt_alloc_id(struct rpc_xprt *xprt)
+{
+       int id;
+
+       id = ida_simple_get(&rpc_xprt_ids, 0, 0, GFP_KERNEL);
+       if (id < 0)
+               return id;
+
+       xprt->id = id;
+       return 0;
+}
+
+static void xprt_free_id(struct rpc_xprt *xprt)
+{
+       ida_simple_remove(&rpc_xprt_ids, xprt->id);
+}
+
 struct rpc_xprt *xprt_alloc(struct net *net, size_t size,
                unsigned int num_prealloc,
                unsigned int max_alloc)
@@ -1758,6 +1782,7 @@ struct rpc_xprt *xprt_alloc(struct net *net, size_t size,
        if (xprt == NULL)
                goto out;
 
+       xprt_alloc_id(xprt);
        xprt_init(xprt, net);
 
        for (i = 0; i < num_prealloc; i++) {
@@ -1786,6 +1811,7 @@ void xprt_free(struct rpc_xprt *xprt)
 {
        put_net(xprt->xprt_net);
        xprt_free_all_slots(xprt);
+       xprt_free_id(xprt);
        kfree_rcu(xprt, rcu);
 }
 EXPORT_SYMBOL_GPL(xprt_free);