OSDN Git Service

xsk: add id to umem
authorBjörn Töpel <bjorn.topel@intel.com>
Thu, 24 Jan 2019 18:59:38 +0000 (19:59 +0100)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 25 Jan 2019 00:50:03 +0000 (01:50 +0100)
This commit adds an id to the umem structure. The id uniquely
identifies a umem instance, and will be exposed to user-space via the
socket monitoring interface.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
include/net/xdp_sock.h
net/xdp/xdp_umem.c

index 13acb98..61cf7db 100644 (file)
@@ -42,6 +42,7 @@ struct xdp_umem {
        struct work_struct work;
        struct page **pgs;
        u32 npgs;
+       int id;
        struct net_device *dev;
        struct xdp_umem_fq_reuse *fq_reuse;
        u16 queue_id;
index a264cf2..eabdb0f 100644 (file)
 #include <linux/mm.h>
 #include <linux/netdevice.h>
 #include <linux/rtnetlink.h>
+#include <linux/idr.h>
 
 #include "xdp_umem.h"
 #include "xsk_queue.h"
 
 #define XDP_UMEM_MIN_CHUNK_SIZE 2048
 
+static DEFINE_IDA(umem_ida);
+
 void xdp_add_sk_umem(struct xdp_umem *umem, struct xdp_sock *xs)
 {
        unsigned long flags;
@@ -183,6 +186,8 @@ static void xdp_umem_release(struct xdp_umem *umem)
 
        xdp_umem_clear_dev(umem);
 
+       ida_simple_remove(&umem_ida, umem->id);
+
        if (umem->fq) {
                xskq_destroy(umem->fq);
                umem->fq = NULL;
@@ -389,8 +394,16 @@ struct xdp_umem *xdp_umem_create(struct xdp_umem_reg *mr)
        if (!umem)
                return ERR_PTR(-ENOMEM);
 
+       err = ida_simple_get(&umem_ida, 0, 0, GFP_KERNEL);
+       if (err < 0) {
+               kfree(umem);
+               return ERR_PTR(err);
+       }
+       umem->id = err;
+
        err = xdp_umem_reg(umem, mr);
        if (err) {
+               ida_simple_remove(&umem_ida, umem->id);
                kfree(umem);
                return ERR_PTR(err);
        }