On Tue, Dec 18, 2018 at 6:34 AM Björn Töpel <bjorn.to...@gmail.com> wrote: > > Den mån 17 dec. 2018 kl 20:40 skrev William Tu <u9012...@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 <u9012...@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 > >