Merge tag 'sched-urgent-2021-07-11' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / net / sunrpc / xprt.c
index 3509a7f..fb6db09 100644 (file)
@@ -55,6 +55,7 @@
 #include <trace/events/sunrpc.h>
 
 #include "sunrpc.h"
+#include "sysfs.h"
 
 /*
  * Local variables
@@ -443,7 +444,7 @@ void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task)
 }
 EXPORT_SYMBOL_GPL(xprt_release_xprt_cong);
 
-static inline void xprt_release_write(struct rpc_xprt *xprt, struct rpc_task *task)
+void xprt_release_write(struct rpc_xprt *xprt, struct rpc_task *task)
 {
        if (xprt->snd_task != task)
                return;
@@ -1746,6 +1747,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 +1783,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 +1812,8 @@ void xprt_free(struct rpc_xprt *xprt)
 {
        put_net(xprt->xprt_net);
        xprt_free_all_slots(xprt);
+       xprt_free_id(xprt);
+       rpc_sysfs_xprt_destroy(xprt);
        kfree_rcu(xprt, rcu);
 }
 EXPORT_SYMBOL_GPL(xprt_free);