From patchwork Wed Jun 27 02:46:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saeed Mahameed X-Patchwork-Id: 935237 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=dev.mellanox.co.il Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=dev-mellanox-co-il.20150623.gappssmtp.com header.i=@dev-mellanox-co-il.20150623.gappssmtp.com header.b="lOGFWu0H"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41FnP55FnSz9s0n for ; Wed, 27 Jun 2018 12:46:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932214AbeF0Cqr (ORCPT ); Tue, 26 Jun 2018 22:46:47 -0400 Received: from mail-pl0-f65.google.com ([209.85.160.65]:46195 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932147AbeF0Cqo (ORCPT ); Tue, 26 Jun 2018 22:46:44 -0400 Received: by mail-pl0-f65.google.com with SMTP id 30-v6so282617pld.13 for ; Tue, 26 Jun 2018 19:46:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dev-mellanox-co-il.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bo6NWNbu0Z77UtlSRH84WMQTHNsz2Hj8haWbGNNE8+g=; b=lOGFWu0H5av4Smb5y+gkL1z+Xvh5Q+kDoGIk/W+3Yux5UUtF25UvJRDK+SWFcOPpgf Q8Ydb3toseWtN60xpHlvA6WX9r6E7d1vwdFIck92hUoGdX77UnA9LoxsGhRaX4yTnuWB KVfvZx6vrqaDXA1wExqlNMtoV50vRawFKWBlweE1L6pVgolyPliCtOyTRlSpaWR/DbUw O73IdizjWW9i18FfExSpw0p5Z97gw3N0we8l0EXlOTd0YPhARivmqPj5OBODV9+SWlOl O2BEZn6SW001aQ/IrpX53ruAX9qS4g0Exny7VYHh6AkFbFbtFO4NwIApULsnmH3j4X1g oeww== 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:in-reply-to :references; bh=bo6NWNbu0Z77UtlSRH84WMQTHNsz2Hj8haWbGNNE8+g=; b=DVgP4W8X8chV4PCDHNnijkg47KuzTA7T+xTj7bqa7WhhlNJlVA8iyVziaTXQmOjRdV qDVHBe1mNwpRxIFgCIwY1PRBGW1WZfoVPDP45sOn4p8zzZLDq+vklMjiZAN6dVeHK511 whaJwPwbWEyxMhbmiqBtr2KaM3fi+8z7WJ1ySFrHLD51ydcK5HeIj+7JhPeZ9C0or2Sh CBJMHUddK79SHkrd5QVaGsg/DBQz7GGLg160R5avbpklKwC+oAXUZIbB7nxsE8HnOjlI o+4BzcxkOP1vp8/Bif5jBOIHBfSoWXFLFCUXeDaiyGvNcGYQ27LwUdcwWqclW1hJh4ta KAYw== X-Gm-Message-State: APt69E3SbrUhTBmM28k2eNUICH5hkhXCuuGJC1LdnPbgTXPQ+WSCFL1l mpdO/uvxuu/cbHaqetCg+igGZA== X-Google-Smtp-Source: ADUXVKJ8+Vd5QFP0UTU38w5F0kEZsc8U0LHi1f4IJ5Q3vywpap9XBOfD2DXROHDN3PQ0IsJBLDOmyw== X-Received: by 2002:a17:902:b81:: with SMTP id 1-v6mr4218608plr.164.1530067603748; Tue, 26 Jun 2018 19:46:43 -0700 (PDT) Received: from stpd.hsd1.ca.comcast.net ([2601:647:4000:4586::4088]) by smtp.gmail.com with ESMTPSA id j21-v6sm3950904pfn.121.2018.06.26.19.46.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 26 Jun 2018 19:46:42 -0700 (PDT) From: Saeed Mahameed X-Google-Original-From: Saeed Mahameed To: Jesper Dangaard Brouer , Alexei Starovoitov , Daniel Borkmann Cc: neerav.parikh@intel.com, pjwaskiewicz@gmail.com, ttoukan.linux@gmail.com, Tariq Toukan , alexander.h.duyck@intel.com, peter.waskiewicz.jr@intel.com, Opher Reviv , Rony Efraim , netdev@vger.kernel.org, Saeed Mahameed Subject: [RFC bpf-next 5/6] net/mlx5e: Add XDP RX meta data support Date: Tue, 26 Jun 2018 19:46:14 -0700 Message-Id: <20180627024615.17856-6-saeedm@mellanox.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180627024615.17856-1-saeedm@mellanox.com> References: <20180627024615.17856-1-saeedm@mellanox.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Implement XDP meta data hash and vlan support. 1. on xdp setup ndo: add support for XDP_QUERY_META_FLAGS and return the two supported flags 2. use xdp_data_meta_set_hash and xdp_data_meta_set_vlan helpers to fill in the meta data fileds. Signed-off-by: Saeed Mahameed --- .../net/ethernet/mellanox/mlx5/core/en_main.c | 6 ++++ .../net/ethernet/mellanox/mlx5/core/en_rx.c | 30 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 8debae6b9cab..3d1066a953cb 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -4189,6 +4189,9 @@ static u32 mlx5e_xdp_query(struct net_device *dev) return prog_id; } +#define MLX5E_SUPPORTED_XDP_META_FLAGS \ + (XDP_FLAGS_META_HASH | XDP_FLAGS_META_VLAN) + static int mlx5e_xdp(struct net_device *dev, struct netdev_bpf *xdp) { struct mlx5e_xdp_info xdp_info; @@ -4204,6 +4207,9 @@ static int mlx5e_xdp(struct net_device *dev, struct netdev_bpf *xdp) xdp->prog_id = mlx5e_xdp_query(dev); xdp->prog_attached = !!xdp->prog_id; return 0; + case XDP_QUERY_META_FLAGS: + xdp->meta_flags = MLX5E_SUPPORTED_XDP_META_FLAGS; + return 0; default: return -EINVAL; } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index e37f9747a0e3..1f3e934d0dd8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -920,6 +920,29 @@ static inline bool mlx5e_xmit_xdp_frame(struct mlx5e_rq *rq, return true; } +static void +mlx5e_xdp_fill_data_meta(xdp_md_info_arr mdi, void *data_meta, struct mlx5_cqe64 *cqe) +{ + if (xdp_data_meta_present(mdi, XDP_DATA_META_HASH)) + { + u8 cht = cqe->rss_hash_type; + int ht = (cht & CQE_RSS_HTYPE_L4) ? PKT_HASH_TYPE_L4 : + (cht & CQE_RSS_HTYPE_IP) ? PKT_HASH_TYPE_L3 : + PKT_HASH_TYPE_NONE; + u32 hash = be32_to_cpu(cqe->rss_hash_result); + + xdp_data_meta_set_hash(mdi, data_meta, hash, ht); + } + + if (xdp_data_meta_present(mdi, XDP_DATA_META_VLAN)) + { + u16 vlan = (!!cqe_has_vlan(cqe) * VLAN_TAG_PRESENT) | + be16_to_cpu(cqe->vlan_info); + + xdp_data_meta_set_vlan(mdi, data_meta, vlan); + } +} + /* returns true if packet was consumed by xdp */ static inline bool mlx5e_xdp_handle(struct mlx5e_rq *rq, struct mlx5e_dma_info *di, @@ -935,11 +958,16 @@ static inline bool mlx5e_xdp_handle(struct mlx5e_rq *rq, return false; xdp.data = va + *rx_headroom; - xdp_set_data_meta_invalid(&xdp); xdp.data_end = xdp.data + *len; xdp.data_hard_start = va; xdp.rxq = &rq->xdp_rxq; + if (rq->xdp.flags & XDP_FLAGS_META_ALL) { + xdp_reset_data_meta(&xdp); + mlx5e_xdp_fill_data_meta(rq->xdp.md_info, xdp.data_meta, cqe); + } else + xdp_set_data_meta_invalid(&xdp); + act = bpf_prog_run_xdp(prog, &xdp); switch (act) { case XDP_PASS: