Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6145903 authored by Magnus Karlsson's avatar Magnus Karlsson Committed by Alexei Starovoitov
Browse files

xsk: add Tx queue setup and mmap support



Another setsockopt (XDP_TX_QUEUE) is added to let the process allocate
a queue, where the user process can pass frames to be transmitted by
the kernel.

The mmapping of the queue is done using the XDP_PGOFF_TX_QUEUE offset.

Signed-off-by: default avatarMagnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent fe230832
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ struct xdp_sock {
	struct xdp_umem *umem;
	struct list_head flush_node;
	u16 queue_id;
	struct xsk_queue *tx ____cacheline_aligned_in_smp;
	/* Protects multiple processes in the control path */
	struct mutex mutex;
	u64 rx_dropped;
+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ struct sockaddr_xdp {

/* XDP socket options */
#define XDP_RX_RING			1
#define XDP_TX_RING			2
#define XDP_UMEM_REG			3
#define XDP_UMEM_FILL_RING		4
#define XDP_UMEM_COMPLETION_RING	5
@@ -47,6 +48,7 @@ struct xdp_umem_reg {

/* Pgoff for mmaping the rings */
#define XDP_PGOFF_RX_RING			  0
#define XDP_PGOFF_TX_RING		 0x80000000
#define XDP_UMEM_PGOFF_FILL_RING	0x100000000
#define XDP_UMEM_PGOFF_COMPLETION_RING	0x180000000

+6 −2
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
		goto out_release;
	}

	if (!xs->rx) {
	if (!xs->rx && !xs->tx) {
		err = -EINVAL;
		goto out_unlock;
	}
@@ -291,6 +291,7 @@ static int xsk_setsockopt(struct socket *sock, int level, int optname,

	switch (optname) {
	case XDP_RX_RING:
	case XDP_TX_RING:
	{
		struct xsk_queue **q;
		int entries;
@@ -301,7 +302,7 @@ static int xsk_setsockopt(struct socket *sock, int level, int optname,
			return -EFAULT;

		mutex_lock(&xs->mutex);
		q = &xs->rx;
		q = (optname == XDP_TX_RING) ? &xs->tx : &xs->rx;
		err = xsk_init_queue(entries, q, false);
		mutex_unlock(&xs->mutex);
		return err;
@@ -372,6 +373,8 @@ static int xsk_mmap(struct file *file, struct socket *sock,

	if (offset == XDP_PGOFF_RX_RING) {
		q = xs->rx;
	} else if (offset == XDP_PGOFF_TX_RING) {
		q = xs->tx;
	} else {
		if (!xs->umem)
			return -EINVAL;
@@ -431,6 +434,7 @@ static void xsk_destruct(struct sock *sk)
		return;

	xskq_destroy(xs->rx);
	xskq_destroy(xs->tx);
	xdp_put_umem(xs->umem);

	sk_refcnt_debug_dec(sk);