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