diff mbox series

[bpf-next,RFC,1/3] xsk: add xsk_umem_consume_tx_virtual.

Message ID 1545075585-27744-2-git-send-email-u9012063@gmail.com
State RFC, archived
Delegated to: BPF Maintainers
Headers show
Series [bpf-next,RFC,1/3] xsk: add xsk_umem_consume_tx_virtual. | expand

Commit Message

William Tu Dec. 17, 2018, 7:39 p.m. UTC
Currently the xsk_umem_consume_tx expects only the physical NICs so
the api returns a dma address.  This patch introduce the new function
to return the virtual address, when XSK is used by a virtual device.

Signed-off-by: William Tu <u9012063@gmail.com>
---
 include/net/xdp_sock.h |  7 +++++++
 net/xdp/xsk.c          | 24 ++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

Comments

Björn Töpel Dec. 18, 2018, 2:34 p.m. UTC | #1
Den mån 17 dec. 2018 kl 20:40 skrev William Tu <u9012063@gmail.com>:
>
> Currently the xsk_umem_consume_tx expects only the physical NICs so
> the api returns a dma address.  This patch introduce the new function
> to return the virtual address, when XSK is used by a virtual device.
>
> Signed-off-by: William Tu <u9012063@gmail.com>
> ---
>  include/net/xdp_sock.h |  7 +++++++
>  net/xdp/xsk.c          | 24 ++++++++++++++++++++++++
>  2 files changed, 31 insertions(+)
>
> diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h
> index 13acb9803a6d..8de6b8456945 100644
> --- a/include/net/xdp_sock.h
> +++ b/include/net/xdp_sock.h
> @@ -81,6 +81,7 @@ u64 *xsk_umem_peek_addr(struct xdp_umem *umem, u64 *addr);
>  void xsk_umem_discard_addr(struct xdp_umem *umem);
>  void xsk_umem_complete_tx(struct xdp_umem *umem, u32 nb_entries);
>  bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len);
> +bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, char **addr, u32 *len);
>  void xsk_umem_consume_tx_done(struct xdp_umem *umem);
>  struct xdp_umem_fq_reuse *xsk_reuseq_prepare(u32 nentries);
>  struct xdp_umem_fq_reuse *xsk_reuseq_swap(struct xdp_umem *umem,
> @@ -165,6 +166,12 @@ static inline bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma,
>         return false;
>  }
>
> +static inline bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem,
> +                                              char **dma, u32 *len)

Nit: dma->addr

> +{
> +       return false;
> +}
> +
>  static inline void xsk_umem_consume_tx_done(struct xdp_umem *umem)
>  {
>  }
> diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
> index 07156f43d295..379f5e9d0c81 100644
> --- a/net/xdp/xsk.c
> +++ b/net/xdp/xsk.c
> @@ -197,6 +197,30 @@ bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len)
>  }
>  EXPORT_SYMBOL(xsk_umem_consume_tx);
>
> +bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, char **addr, u32 *len)

Prefer void ** in favor of char**?

> +{
> +       struct xdp_desc desc;
> +       struct xdp_sock *xs;
> +
> +       rcu_read_lock();
> +       list_for_each_entry_rcu(xs, &umem->xsk_list, list) {
> +               if (!xskq_peek_desc(xs->tx, &desc))
> +                        continue;
> +               if (xskq_produce_addr_lazy(umem->cq, desc.addr))
> +                       goto out;
> +
> +               *addr = xdp_umem_get_data(umem, desc.addr);
> +               *len = desc.len;
> +               xskq_discard_desc(xs->tx);
> +               rcu_read_unlock();
> +               return true;
> +       }
> +out:
> +       rcu_read_unlock();
> +       return false;
> +}
> +EXPORT_SYMBOL(xsk_umem_consume_tx_virtual);

Is possible to make xsk_umem_consume_tx_virtual and
xsk_umem_consume_tx share a common implementation. They are very
similar.

> +
>  static int xsk_zc_xmit(struct sock *sk)
>  {
>         struct xdp_sock *xs = xdp_sk(sk);
> --
> 2.7.4
>
William Tu Dec. 18, 2018, 6:39 p.m. UTC | #2
On Tue, Dec 18, 2018 at 6:34 AM Björn Töpel <bjorn.topel@gmail.com> wrote:
>
> Den mån 17 dec. 2018 kl 20:40 skrev William Tu <u9012063@gmail.com>:
> >
> > Currently the xsk_umem_consume_tx expects only the physical NICs so
> > the api returns a dma address.  This patch introduce the new function
> > to return the virtual address, when XSK is used by a virtual device.
> >
> > Signed-off-by: William Tu <u9012063@gmail.com>
> > ---
> >  include/net/xdp_sock.h |  7 +++++++
> >  net/xdp/xsk.c          | 24 ++++++++++++++++++++++++
> >  2 files changed, 31 insertions(+)
> >
> > diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h
> > index 13acb9803a6d..8de6b8456945 100644
> > --- a/include/net/xdp_sock.h
> > +++ b/include/net/xdp_sock.h
> > @@ -81,6 +81,7 @@ u64 *xsk_umem_peek_addr(struct xdp_umem *umem, u64 *addr);
> >  void xsk_umem_discard_addr(struct xdp_umem *umem);
> >  void xsk_umem_complete_tx(struct xdp_umem *umem, u32 nb_entries);
> >  bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len);
> > +bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, char **addr, u32 *len);
> >  void xsk_umem_consume_tx_done(struct xdp_umem *umem);
> >  struct xdp_umem_fq_reuse *xsk_reuseq_prepare(u32 nentries);
> >  struct xdp_umem_fq_reuse *xsk_reuseq_swap(struct xdp_umem *umem,
> > @@ -165,6 +166,12 @@ static inline bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma,
> >         return false;
> >  }
> >
> > +static inline bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem,
> > +                                              char **dma, u32 *len)
>
> Nit: dma->addr
>
> > +{
> > +       return false;
> > +}
> > +
> >  static inline void xsk_umem_consume_tx_done(struct xdp_umem *umem)
> >  {
> >  }
> > diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
> > index 07156f43d295..379f5e9d0c81 100644
> > --- a/net/xdp/xsk.c
> > +++ b/net/xdp/xsk.c
> > @@ -197,6 +197,30 @@ bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len)
> >  }
> >  EXPORT_SYMBOL(xsk_umem_consume_tx);
> >
> > +bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, char **addr, u32 *len)
>
> Prefer void ** in favor of char**?
>
> > +{
> > +       struct xdp_desc desc;
> > +       struct xdp_sock *xs;
> > +
> > +       rcu_read_lock();
> > +       list_for_each_entry_rcu(xs, &umem->xsk_list, list) {
> > +               if (!xskq_peek_desc(xs->tx, &desc))
> > +                        continue;
> > +               if (xskq_produce_addr_lazy(umem->cq, desc.addr))
> > +                       goto out;
> > +
> > +               *addr = xdp_umem_get_data(umem, desc.addr);
> > +               *len = desc.len;
> > +               xskq_discard_desc(xs->tx);
> > +               rcu_read_unlock();
> > +               return true;
> > +       }
> > +out:
> > +       rcu_read_unlock();
> > +       return false;
> > +}
> > +EXPORT_SYMBOL(xsk_umem_consume_tx_virtual);
>
> Is possible to make xsk_umem_consume_tx_virtual and
> xsk_umem_consume_tx share a common implementation. They are very
> similar.

Sure, will do it in next version.
Thanks
William
>
> > +
> >  static int xsk_zc_xmit(struct sock *sk)
> >  {
> >         struct xdp_sock *xs = xdp_sk(sk);
> > --
> > 2.7.4
> >
diff mbox series

Patch

diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h
index 13acb9803a6d..8de6b8456945 100644
--- a/include/net/xdp_sock.h
+++ b/include/net/xdp_sock.h
@@ -81,6 +81,7 @@  u64 *xsk_umem_peek_addr(struct xdp_umem *umem, u64 *addr);
 void xsk_umem_discard_addr(struct xdp_umem *umem);
 void xsk_umem_complete_tx(struct xdp_umem *umem, u32 nb_entries);
 bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len);
+bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, char **addr, u32 *len);
 void xsk_umem_consume_tx_done(struct xdp_umem *umem);
 struct xdp_umem_fq_reuse *xsk_reuseq_prepare(u32 nentries);
 struct xdp_umem_fq_reuse *xsk_reuseq_swap(struct xdp_umem *umem,
@@ -165,6 +166,12 @@  static inline bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma,
 	return false;
 }
 
+static inline bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem,
+					       char **dma, u32 *len)
+{
+	return false;
+}
+
 static inline void xsk_umem_consume_tx_done(struct xdp_umem *umem)
 {
 }
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index 07156f43d295..379f5e9d0c81 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -197,6 +197,30 @@  bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len)
 }
 EXPORT_SYMBOL(xsk_umem_consume_tx);
 
+bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, char **addr, u32 *len)
+{
+	struct xdp_desc desc;
+	struct xdp_sock *xs;
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(xs, &umem->xsk_list, list) {
+		if (!xskq_peek_desc(xs->tx, &desc))
+			 continue;
+		if (xskq_produce_addr_lazy(umem->cq, desc.addr))
+			goto out;
+
+		*addr = xdp_umem_get_data(umem, desc.addr);
+		*len = desc.len;
+		xskq_discard_desc(xs->tx);
+		rcu_read_unlock();
+		return true;
+	}
+out:
+	rcu_read_unlock();
+	return false;
+}
+EXPORT_SYMBOL(xsk_umem_consume_tx_virtual);
+
 static int xsk_zc_xmit(struct sock *sk)
 {
 	struct xdp_sock *xs = xdp_sk(sk);