From patchwork Fri Dec 21 13:22:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Domagoj Pintaric X-Patchwork-Id: 1017518 X-Patchwork-Delegate: davem@davemloft.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=none (p=none dis=none) header.from=sartura.hr Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.b="BbYdudXg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Lq774TdGz9sDL for ; Sat, 22 Dec 2018 00:22:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390589AbeLUNWl (ORCPT ); Fri, 21 Dec 2018 08:22:41 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:46956 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388588AbeLUNWl (ORCPT ); Fri, 21 Dec 2018 08:22:41 -0500 Received: by mail-wr1-f66.google.com with SMTP id l9so5232716wrt.13 for ; Fri, 21 Dec 2018 05:22:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sartura-hr.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Yf5SQeEdmKealwafoYyFRO7ffFkA8pchJL6O+7UddL4=; b=BbYdudXg6nMCcM3z4IU3s7smnWShuS3I89UgZ/175NHWob2HPvlejUxeIdkSOg+1KX KZBgiwDpFr2MeB6z5brdW8YGmIZS+4DxoRSGOFAyTys9JK2rYHWK2hFQnJpxKHmtKzK+ HUHAdrM6/w1s4EoaZ3QUQlPycoQWrwo571T9oAokVYMpkzo+dzSLwUjcT9UJq5rOcZ9a CJit0PrKvCqgA+YFtqahmSJp85RZ0SWuEAb8amw6iKWgXfyB1u9dKqxE2eaaSBlqCcIH OBmz70UsxFH983bcTPID8iLKEANmcF9vKmZf+LMFKttaOvVhp9R8NKttiXgEBc3zGq1/ vkJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Yf5SQeEdmKealwafoYyFRO7ffFkA8pchJL6O+7UddL4=; b=CfYYK99+rhOMvg07vlLXVL83xYioJN/2/W6JjNYrAOt4h/fBtsjGDgt8gf1OwUX9/l giCp6HhOViasSzLrwSs6Rmy0Up/8ixo1OgHjWMvE9xPv1vDlp81hmOyA3f60H0fM9Mwr RQ5am0FWSqv0FZn2KpNiaTk+fM6ViG72Vwet3IvcVRq8f+6SJX+aC/4eCwHZutYJ7lpy mgH+IgSD3NFu/1Tq53VGmyJxTe6Gkfx8fdxSZ+ReDdlsEQkYW3MN6hTVjFsH49Q/G35S ZOQzvXQtfBEQSQsxx8xsWEYEiXMncUvNezWlzV3+eSYnE1mxfJYBogvsd1gXhSA3tWHq qKyw== X-Gm-Message-State: AJcUuket4DuP8H23X6RppUK7xLNi50Fcx7eJUARrEmSNMljmCkoou+Qv P5doFItSodYs+g0949xi9FrU1o9qejceLudq6Z243vunRdsteS8ajNOMvZUMTvX2OLuNlwK7xo2 1qjSk3Jx8mR4u38mfSmJ/1GAeGPTRwuFtSFRtn1CzC6RrQxYJtwwujGXoFeG4ML7CJikskTICC9 nC47rt X-Google-Smtp-Source: ALg8bN6Zx/KWb2uXjb073yB1MYb0O/zc/aycWh/Nb9Ezqdf0WMlCQDWrPGvfvRNd8L0/JBlrBikmyA== X-Received: by 2002:a5d:64c7:: with SMTP id y7mr2588268wrv.207.1545398558645; Fri, 21 Dec 2018 05:22:38 -0800 (PST) Received: from localhost.localdomain (cpe-94-253-224-68.st.cable.xnet.hr. [94.253.224.68]) by smtp.gmail.com with ESMTPSA id 199sm13803851wmh.21.2018.12.21.05.22.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 21 Dec 2018 05:22:37 -0800 (PST) From: Domagoj Pintaric To: netdev@vger.kernel.org Cc: Domagoj Pintaric , Luka Perkov , Thomas Petazzoni , "David S . Miller" Subject: [PATCH v2] net: mvneta: add basic XDP_DROP support Date: Fri, 21 Dec 2018 14:22:23 +0100 Message-Id: <20181221132223.14012-1-domagoj.pintaric@sartura.hr> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add initial mvneta XDP support for hardware buffer management enabled devices only. Signed-off-by: Domagoj Pintaric CC: Luka Perkov CC: Thomas Petazzoni CC: David S. Miller --- v2: - fixed unused value warning - added additional hardware buffer management check --- drivers/net/ethernet/marvell/mvneta.c | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 61b23497f836..00c890bdf31e 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "mvneta_bm.h" #include @@ -454,6 +455,8 @@ struct mvneta_port { bool neta_armada3700; u16 rx_offset_correction; const struct mbus_dram_target_info *dram_target_info; + + struct bpf_prog *xdp_prog; }; /* The mvneta_tx_desc and mvneta_rx_desc structures describe the @@ -626,6 +629,8 @@ struct mvneta_rx_queue { /* error counters */ u32 skb_alloc_err; u32 refill_err; + + struct bpf_prog *xdp_prog; }; static enum cpuhp_state online_hpstate; @@ -2099,6 +2104,7 @@ static int mvneta_rx_hwbm(struct napi_struct *napi, int rx_done; u32 rcvd_pkts = 0; u32 rcvd_bytes = 0; + struct bpf_prog *xdp_prog; /* Get number of received packets */ rx_done = mvneta_rxq_busy_desc_num_get(pp, rxq); @@ -2140,6 +2146,29 @@ static int mvneta_rx_hwbm(struct napi_struct *napi, continue; } + xdp_prog = READ_ONCE(rxq->xdp_prog); + if (xdp_prog) { + struct xdp_buff xdp; + enum xdp_action act; + + xdp.data = data + MVNETA_MH_SIZE + NET_SKB_PAD; + xdp.data_end = xdp.data + rx_bytes; + + act = bpf_prog_run_xdp(xdp_prog, &xdp); + switch (act) { + case XDP_PASS: + break; + default: + bpf_warn_invalid_xdp_action(act); + /* fall through */ + case XDP_DROP: + /* Return the buffer to the pool */ + mvneta_bm_pool_put_bp(pp->bm_priv, bm_pool, + rx_desc->buf_phys_addr); + continue; + } + } + if (rx_bytes <= rx_copybreak) { /* better copy a small frame and not unmap the DMA region */ skb = netdev_alloc_skb_ip_align(dev, rx_bytes); @@ -2935,6 +2964,8 @@ static int mvneta_rxq_init(struct mvneta_port *pp, mvneta_rxq_hw_init(pp, rxq); + rxq->xdp_prog = pp->xdp_prog; + return 0; } @@ -2961,6 +2992,7 @@ static void mvneta_rxq_deinit(struct mvneta_port *pp, rxq->refill_num = 0; rxq->skb = NULL; rxq->left_size = 0; + rxq->xdp_prog = NULL; } static int mvneta_txq_sw_init(struct mvneta_port *pp, @@ -3878,6 +3910,43 @@ static int mvneta_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) return phylink_mii_ioctl(pp->phylink, ifr, cmd); } +static int mvneta_xdp_set(struct net_device *dev, struct bpf_prog *xdp_prog) +{ + struct mvneta_port *pp = netdev_priv(dev); + struct bpf_prog *xdp_prog_old; + int queue; + + if (!pp->bm_priv) + return -EINVAL; + + xdp_prog_old = xchg(&pp->xdp_prog, xdp_prog); + + for (queue = 0; queue < rxq_number; queue++) { + struct mvneta_rx_queue *rxq = &pp->rxqs[queue]; + (void)xchg(&rxq->xdp_prog, pp->xdp_prog); + } + + if (xdp_prog_old) + bpf_prog_put(xdp_prog_old); + + return 0; +} + +static int mvneta_bpf(struct net_device *dev, struct netdev_bpf *bpf) +{ + struct mvneta_port *pp = netdev_priv(dev); + + switch (bpf->command) { + case XDP_SETUP_PROG: + return mvneta_xdp_set(dev, bpf->prog); + case XDP_QUERY_PROG: + bpf->prog_id = pp->xdp_prog ? pp->xdp_prog->aux->id : 0; + return 0; + default: + return -EINVAL; + } +} + /* Ethtool methods */ /* Set link ksettings (phy address, speed) for ethtools */ @@ -4275,6 +4344,7 @@ static const struct net_device_ops mvneta_netdev_ops = { .ndo_fix_features = mvneta_fix_features, .ndo_get_stats64 = mvneta_get_stats64, .ndo_do_ioctl = mvneta_ioctl, + .ndo_bpf = mvneta_bpf, }; static const struct ethtool_ops mvneta_eth_tool_ops = {