From patchwork Wed Dec 26 20:27:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1018731 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="X0MwM1VF"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Q4L42WYfz9sCr for ; Thu, 27 Dec 2018 07:28:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727685AbeLZU2X (ORCPT ); Wed, 26 Dec 2018 15:28:23 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:45714 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727513AbeLZU2W (ORCPT ); Wed, 26 Dec 2018 15:28:22 -0500 Received: by mail-pf1-f195.google.com with SMTP id g62so8215847pfd.12 for ; Wed, 26 Dec 2018 12:28:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=C8sDSQVHPnIyd6UC0lHfEe89QhjRPtO9aa9eLwG/GjE=; b=X0MwM1VF8LO7eYRL6nxQR6X4m7ukgeNyudk0EhKkBeVgZ5mYFndlceR3OtCPIzGAxb /STyKY0m78mHiofGRpXNIYkSn7aRkdkJx2C8PWlWPmY4ZLRstXQzP/eTNCuGZipfZCzC CbgUrvyfjmIU395KZS/5VrHQYZIwDOcd/JZIi0M0qZOO8pcqqzZnSazkl6psRFnUXKnM qU0Pl31uB6Z/UKF7giND12RAZnyT0ySWPE6nQgaFQHo8PlpxCO6WAiPvKwuMsCyyBPRY IF8xX8kbUaZMAT1oHa65u8cNWzPrvflgM73bfp1D54iTYCkzDF/ZvoXyHlXXH40iwwMY uEhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=C8sDSQVHPnIyd6UC0lHfEe89QhjRPtO9aa9eLwG/GjE=; b=XA44c7MLhNyBHdnO8KS7ucEFo/rMUlfKUSax5cnivHEax7TxfKCgy32jXLqI3Gq8jb EWcUvYgBjwLaQjWihiPoRW/uQKaR9aiab3tLD3CUp3w8mBa7lYNZlv2xd5+HoEs2jjvq Wjj8TC5lQMGvXbJWkAGtlurgc4mNgQZr4WeR8pdBD3GdvLpYxrAOgYgFQHLjZSPTzmj1 92krKzBeWWAZ57vObHD3/uGu3QpLUKxSZPBPdnrQxyyH7ZDRyA5JonGqpz25wrZ9B/kw T+hnCsp33tM7XQG8hvzTcPpNlXDO1a9CIPdPNT2GYTiclA72YAoNiILw8rK4af1AMQoi 1CWg== X-Gm-Message-State: AJcUukdMnT5hBjXr9ZCCTSJUgMbflBtEYwMnTZnviUIaaBbEFU4QwHVw B/J7kQkvmzZ2e41SbOKlZ7IA+/rf X-Google-Smtp-Source: ALg8bN63eeHwdIKNIhtol25XyvtUVWljm2XKl5a3O5ZnRFRHE1/l7r4mUuQsKUXjrye2W/IIMMEj7Q== X-Received: by 2002:a63:d301:: with SMTP id b1mr20348429pgg.61.1545856100351; Wed, 26 Dec 2018 12:28:20 -0800 (PST) Received: from sc9-mailhost2.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id t90sm72712460pfj.23.2018.12.26.12.28.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Dec 2018 12:28:19 -0800 (PST) From: William Tu To: bjorn.topel@gmail.com, magnus.karlsson@gmail.com, ast@kernel.org, daniel@iogearbox.net, netdev@vger.kernel.org, makita.toshiaki@lab.ntt.co.jp, yihung.wei@gmail.com, magnus.karlsson@intel.com Subject: [PATCH bpf-next RFCv3 1/6] xsk: add xsk_umem_consume_tx_virtual. Date: Wed, 26 Dec 2018 12:27:48 -0800 Message-Id: <1545856073-8680-2-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545856073-8680-1-git-send-email-u9012063@gmail.com> References: <1545856073-8680-1-git-send-email-u9012063@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 --- include/net/xdp_sock.h | 7 +++++++ net/xdp/xdp_umem.c | 1 + net/xdp/xsk.c | 38 +++++++++++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h index 13acb9803a6d..7fefe74f7fb5 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, void **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, + void **vaddr, u32 *len) +{ + return false; +} + static inline void xsk_umem_consume_tx_done(struct xdp_umem *umem) { } diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c index a264cf2accd0..424ae2538f9f 100644 --- a/net/xdp/xdp_umem.c +++ b/net/xdp/xdp_umem.c @@ -60,6 +60,7 @@ struct xdp_umem *xdp_get_umem_from_qid(struct net_device *dev, return NULL; } +EXPORT_SYMBOL(xdp_get_umem_from_qid); static void xdp_clear_umem_at_qid(struct net_device *dev, u16 queue_id) { diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 07156f43d295..0e252047f55f 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -170,22 +170,19 @@ void xsk_umem_consume_tx_done(struct xdp_umem *umem) } EXPORT_SYMBOL(xsk_umem_consume_tx_done); -bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len) +static __always_inline bool __xsk_umem_consume_tx(struct xdp_umem *umem, + struct xdp_desc *desc) { - 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)) + if (!xskq_peek_desc(xs->tx, desc)) continue; - if (xskq_produce_addr_lazy(umem->cq, desc.addr)) + if (xskq_produce_addr_lazy(umem->cq, desc->addr)) goto out; - *dma = xdp_umem_get_dma(umem, desc.addr); - *len = desc.len; - xskq_discard_desc(xs->tx); rcu_read_unlock(); return true; @@ -195,8 +192,35 @@ bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len) rcu_read_unlock(); return false; } + +bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len) +{ + struct xdp_desc desc; + + if (!__xsk_umem_consume_tx(umem, &desc)) + return false; + + *dma = xdp_umem_get_dma(umem, desc.addr); + *len = desc.len; + + return true; +} EXPORT_SYMBOL(xsk_umem_consume_tx); +bool xsk_umem_consume_tx_virtual(struct xdp_umem *umem, void **vaddr, u32 *len) +{ + struct xdp_desc desc; + + if (!__xsk_umem_consume_tx(umem, &desc)) + return false; + + *vaddr = xdp_umem_get_data(umem, desc.addr); + *len = desc.len; + + return true; +} +EXPORT_SYMBOL(xsk_umem_consume_tx_virtual); + static int xsk_zc_xmit(struct sock *sk) { struct xdp_sock *xs = xdp_sk(sk);