From: "Matthew Wilcox (Oracle)" <wi...@infradead.org>

Rename it to 'progs' as this is what's stored there.  The locking is
unchanged, so access to this XArray is protected by both the rtnl lock
and the XArray spinlock.

Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org>
---
 net/sched/cls_bpf.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c
index 3f7a9c02b70c..9a794f557861 100644
--- a/net/sched/cls_bpf.c
+++ b/net/sched/cls_bpf.c
@@ -14,7 +14,7 @@
 #include <linux/skbuff.h>
 #include <linux/filter.h>
 #include <linux/bpf.h>
-#include <linux/idr.h>
+#include <linux/xarray.h>
 
 #include <net/rtnetlink.h>
 #include <net/pkt_cls.h>
@@ -30,7 +30,7 @@ MODULE_DESCRIPTION("TC BPF based classifier");
 
 struct cls_bpf_head {
        struct list_head plist;
-       struct idr handle_idr;
+       struct xarray progs;
        struct rcu_head rcu;
 };
 
@@ -242,7 +242,7 @@ static int cls_bpf_init(struct tcf_proto *tp)
                return -ENOBUFS;
 
        INIT_LIST_HEAD_RCU(&head->plist);
-       idr_init(&head->handle_idr);
+       xa_init_flags(&head->progs, XA_FLAGS_ALLOC1);
        rcu_assign_pointer(tp->root, head);
 
        return 0;
@@ -283,7 +283,7 @@ static void __cls_bpf_delete(struct tcf_proto *tp, struct 
cls_bpf_prog *prog,
 {
        struct cls_bpf_head *head = rtnl_dereference(tp->root);
 
-       idr_remove(&head->handle_idr, prog->handle);
+       xa_erase(&head->progs, prog->handle);
        cls_bpf_stop_offload(tp, prog, extack);
        list_del_rcu(&prog->link);
        tcf_unbind_filter(tp, &prog->res);
@@ -312,7 +312,7 @@ static void cls_bpf_destroy(struct tcf_proto *tp, bool 
rtnl_held,
        list_for_each_entry_safe(prog, tmp, &head->plist, link)
                __cls_bpf_delete(tp, prog, extack);
 
-       idr_destroy(&head->handle_idr);
+       xa_destroy(&head->progs);
        kfree_rcu(head, rcu);
 }
 
@@ -484,23 +484,21 @@ static int cls_bpf_change(struct net *net, struct sk_buff 
*in_skb,
                }
        }
 
+       prog->handle = handle;
        if (handle == 0) {
-               handle = 1;
-               ret = idr_alloc_u32(&head->handle_idr, prog, &handle,
-                                   INT_MAX, GFP_KERNEL);
+               ret = xa_alloc(&head->progs, &prog->handle, prog, xa_limit_31b,
+                               GFP_KERNEL);
        } else if (!oldprog) {
-               ret = idr_alloc_u32(&head->handle_idr, prog, &handle,
-                                   handle, GFP_KERNEL);
+               ret = xa_insert(&head->progs, handle, prog, GFP_KERNEL);
        }
 
        if (ret)
                goto errout;
-       prog->handle = handle;
 
        ret = cls_bpf_set_parms(net, tp, prog, base, tb, tca[TCA_RATE], ovr,
                                extack);
        if (ret < 0)
-               goto errout_idr;
+               goto errout_prog;
 
        ret = cls_bpf_offload(tp, prog, oldprog, extack);
        if (ret)
@@ -510,7 +508,7 @@ static int cls_bpf_change(struct net *net, struct sk_buff 
*in_skb,
                prog->gen_flags |= TCA_CLS_FLAGS_NOT_IN_HW;
 
        if (oldprog) {
-               idr_replace(&head->handle_idr, prog, handle);
+               xa_store(&head->progs, handle, prog, 0);
                list_replace_rcu(&oldprog->link, &prog->link);
                tcf_unbind_filter(tp, &oldprog->res);
                tcf_exts_get_net(&oldprog->exts);
@@ -524,9 +522,9 @@ static int cls_bpf_change(struct net *net, struct sk_buff 
*in_skb,
 
 errout_parms:
        cls_bpf_free_parms(prog);
-errout_idr:
+errout_prog:
        if (!oldprog)
-               idr_remove(&head->handle_idr, prog->handle);
+               xa_erase(&head->progs, prog->handle);
 errout:
        tcf_exts_destroy(&prog->exts);
        kfree(prog);
-- 
2.23.0.rc1

Reply via email to