From patchwork Fri Jan 10 23:32:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Daley X-Patchwork-Id: 13935592 X-Patchwork-Delegate: kuba@kernel.org Received: from alln-iport-2.cisco.com (alln-iport-2.cisco.com [173.37.142.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDD40218AAB for ; Fri, 10 Jan 2025 23:32:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=173.37.142.89 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736551981; cv=none; b=F7f9DmnQWyYFk/LC9oDYdWNFQaS9s0QyOPSw7E89ygmaHFBIzxAXYzetneKn2s/clUDAiFFHk0a7DKNN5tCik99nIoaGmPp3KSxSvIYi1fkI2KgJvCK/+DBpxKPdqVFlS2NN1ZnILrSDnJElnFxA6OZpCv4/B3wvKoSdaBA5pGY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736551981; c=relaxed/simple; bh=gOZ/9xPscm7DHYecaMZItzg+5wHDWiVCyyiGQyAERAM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=cCLp1h2nxOSPEsfdbLD6EYX2CltW8NG/R3P5AnaJupn2xRfp/0WhSkr+C6lFeTXSch/5m6iR2TFL6t2gorE01IQCBBzvyneGFFwIn0rK9mttvT5O2jTTBAncJ1VY7q9uV33JzDojGEUCxYGKhMggoJzcm2rjxebfa+yVhV/ukG0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com; spf=pass smtp.mailfrom=cisco.com; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b=S9iYpEbL; arc=none smtp.client-ip=173.37.142.89 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cisco.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b="S9iYpEbL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.com; i=@cisco.com; l=11406; q=dns/txt; s=iport; t=1736551979; x=1737761579; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=+DrN/uoXLwjyelak05gv0W0iTMTTzvP3vTAQgSR6SgA=; b=S9iYpEbLCt12+RQc4Rw8ZMiPzPMaVgp8o0RyJede70xRFNrrPq/Ns54N 4OLcpVZLIgp+YUvLl2RIsxWIftuckmz9nmqrj3Ko+MDckd7ArB0/XexYy oghFuUo7DvDRxbo9RxdDWGOegol1D+Ix6E8W0gOlV1HsBDebAUE054LGI 0=; X-CSE-ConnectionGUID: 1vy9msTsRrC9kOuN1ZfpuQ== X-CSE-MsgGUID: d9+2nIlYT3Gxl7Iwp/T/7w== X-IPAS-Result: A0AEAAD8rIFnj4v/Ja1aGwEBAQEBAQEBBQEBARIBAQEDAwEBAYF/BgEBAQsBhBlDSIxyX4hynhsUgREDVg8BAQEPRAQBAYUHAop0AiY0CQ4BAgQBAQEBAwIDAQEBAQEBAQEBAQELAQEFAQEBAgEHBRQBAQEBAQE5BQ47hgiGWwIBAycLAUYQUSsrBxKDAYJlA7RNgXkzgQHeM4FtgUgBhWqHX3CEdycbgUlEgRWBO4E+b4QGhwEEgjKFNZ5SSIEhA1ksAVUTDQoLBwWBODoDIgsLDAsUHBUCFR4BEQYQBG1EN4JGaUs6Ag0CNYIeJFiCK4RchEeEVIJLVYJHghR6gRmEAUADCxgNSBEsNwYOGwY+bgebJzyDaAYBgQ4BggUOVZMokh+LcpURhCWBY59jGjOqU5h8IqQlhGaBZzqBWzMaCBsVgyJSGQ+IXIVRDQm8XCUyPAIHCwEBAwmPIy2BTgEB IronPort-Data: A9a23:PlDq66D1+Yp3hRVW/8zjw5YqxClBgxIJ4kV8jS/XYbTApGx2gT1Rx jMXDzyBb/qNYTf1L9pzao3loEwC7JWBx9VmOVdlrnsFo1CmBibm6XV1Cm+qYkt+++WaFBoPA /02M4eGdIZsCCeB/n9BC5C5xVFkz6aEW7HgP+DNPyF1VGdMRTwo4f5Zs7ZRbrVA357gWWthh fuo+5eCYAb8g2YvWo4pw/vrRC1H7ayaVAww5jTSVdgT1HfCmn8cCo4oJK3ZBxPQXolOE+emc P3Ixbe/83mx109F5gSNy+uTnuUiG9Y+DCDW4pZkc/HKbitq+kTe5p0G2M80Mi+7vdkmc+dZk 72hvbToIesg0zaldO41C3G0GAkmVUFKFSOuzXWX6aSuI0P6n3TEmut/XUQtAZYi4M0mAkZT0 6UqJigQV0XW7w626OrTpuhEnM8vKozveYgYoHwllWufBvc9SpeFSKLPjTNa9G5v3YYVQrCEO pdfMGE+BPjDS0Un1lM/CpU+muuhgnTXeDxDo1XTrq0yi4TW5FApgeK8YYCJIrRmQ+1ZzwXCo EPCzliiLQEea/2A0X25tS2z07qncSTTA99KS+biqZaGmma7ymUNBRg+WVKlrPy9jUCiHdRSN yQ89yYzqKEg+VCDQd76UBm15nWDu3Y0WMdaGsU55RuLx66S5ByWbkANSDJbZcNlssIqSTE0/ luUmdWvDjwHmKWcQ3+b95+OoD+yMDRTJmgHDQcCQBcJ7sfLvo4+lFTMQ8xlHarzicf6cQwc2 BiQpyQ4wrFWhskR2uDjpxbMgimnod7CSQtdChjrsnyNtx1oNYu+W5eS83OK7tFdCt+rQEGch S1R8ySB19wmAZaInS2LZewCGrC1+vqIWAEwZ3YxRPHNEBzzoBaekZBs3d1oGKt+3i85ld7Vj K375Fg5CHx7ZSfCgUpLj2SZUJtCIU/ITouNaxwsRoASCqWdjSfelM2UWWae3nr2jG8nmrwlN JGQfK6EVClBV/g7k2fqG7tDgdfHIxzSI0uOGvgXKDz6gNKjiIK9E+1t3KamN7pgtf3Y8G05D f4AZ5PQkH2zr9ESkgGMrNZMdgpVRZTKLZv3sMdQPvWSORZrHXppCvnah9scl39NwcxoehPz1 ijlACdwkQOn7VWecFniQi44MtvHA80gxU/XyARwZj5ELVB/Ot73tM/ytvIfIdEayQCU5acoH qVcK5/dWJyiiF3volwgUHU0l6Q6HDzDuO5EF3DNjOQXF3K4ezH0xw== IronPort-HdrOrdr: A9a23:dsCecq/Xw8DJ9DBwLjRuk+DfI+orL9Y04lQ7vn2ZhyY7TiX+rb HIoB11737JYVoqNU3I3OrwWpVoIkmskaKdn7NwAV7KZmCP0wGVxcNZnO7fKlbbdREWmNQw6U 4ZSdkcNDU1ZmIK9PoTJ2KDYrAd/OU= X-Talos-CUID: 9a23:+mKqCGB3HhqI6gj6E3B55R8RAfw+SGf2nXT3PmnhO2hxVYTAHA== X-Talos-MUID: 9a23:aFS95A2ScMlOZB6Fkrkkb44IDjUj7/XtUkYslaQ64OaUMXNRJC/asHPoXdpy X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,305,1728950400"; d="scan'208";a="409299240" Received: from rcdn-l-core-02.cisco.com ([173.37.255.139]) by alln-iport-2.cisco.com with ESMTP/TLS/TLS_AES_256_GCM_SHA384; 10 Jan 2025 23:32:53 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-l-core-02.cisco.com (Postfix) with ESMTP id 0F25D18000233; Fri, 10 Jan 2025 23:32:53 +0000 (GMT) Received: by cisco.com (Postfix, from userid 392789) id DC98E20F2004; Fri, 10 Jan 2025 15:32:52 -0800 (PST) From: John Daley To: benve@cisco.com, satishkh@cisco.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org Cc: John Daley , Nelson Escobar Subject: [PATCH net-next v5 1/4] enic: Refactor RX path common code into helper functions Date: Fri, 10 Jan 2025 15:32:46 -0800 Message-Id: <20250110233249.23258-2-johndale@cisco.com> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20250110233249.23258-1-johndale@cisco.com> References: <20250110233249.23258-1-johndale@cisco.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-l-core-02.cisco.com X-Patchwork-Delegate: kuba@kernel.org In order to more easily support future packet receive processing schemes and to simplify the receive path, put common code into helper functions in a separate file. No functional change. Co-developed-by: Nelson Escobar Signed-off-by: Nelson Escobar Co-developed-by: Satish Kharat Signed-off-by: Satish Kharat Signed-off-by: John Daley --- drivers/net/ethernet/cisco/enic/Makefile | 2 +- drivers/net/ethernet/cisco/enic/enic_main.c | 100 ++-------------- drivers/net/ethernet/cisco/enic/enic_rq.c | 120 ++++++++++++++++++++ drivers/net/ethernet/cisco/enic/enic_rq.h | 22 ++++ 4 files changed, 150 insertions(+), 94 deletions(-) create mode 100644 drivers/net/ethernet/cisco/enic/enic_rq.c create mode 100644 drivers/net/ethernet/cisco/enic/enic_rq.h diff --git a/drivers/net/ethernet/cisco/enic/Makefile b/drivers/net/ethernet/cisco/enic/Makefile index c3b6febfdbe4..b3b5196b2dfc 100644 --- a/drivers/net/ethernet/cisco/enic/Makefile +++ b/drivers/net/ethernet/cisco/enic/Makefile @@ -3,5 +3,5 @@ obj-$(CONFIG_ENIC) := enic.o enic-y := enic_main.o vnic_cq.o vnic_intr.o vnic_wq.o \ enic_res.o enic_dev.o enic_pp.o vnic_dev.o vnic_rq.o vnic_vic.o \ - enic_ethtool.o enic_api.o enic_clsf.o + enic_ethtool.o enic_api.o enic_clsf.o enic_rq.o diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 49f6cab01ed5..2a1448e98466 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -55,6 +55,7 @@ #include "vnic_vic.h" #include "enic_res.h" #include "enic.h" +#include "enic_rq.h" #include "enic_dev.h" #include "enic_pp.h" #include "enic_clsf.h" @@ -83,7 +84,6 @@ MODULE_AUTHOR("Scott Feldman "); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, enic_id_table); -#define ENIC_LARGE_PKT_THRESHOLD 1000 #define ENIC_MAX_COALESCE_TIMERS 10 /* Interrupt moderation table, which will be used to decide the * coalescing timer values @@ -1361,15 +1361,6 @@ static int enic_rq_alloc_buf(struct vnic_rq *rq) return 0; } -static void enic_intr_update_pkt_size(struct vnic_rx_bytes_counter *pkt_size, - u32 pkt_len) -{ - if (ENIC_LARGE_PKT_THRESHOLD <= pkt_len) - pkt_size->large_pkt_bytes_cnt += pkt_len; - else - pkt_size->small_pkt_bytes_cnt += pkt_len; -} - static bool enic_rxcopybreak(struct net_device *netdev, struct sk_buff **skb, struct vnic_rq_buf *buf, u16 len) { @@ -1389,9 +1380,8 @@ static bool enic_rxcopybreak(struct net_device *netdev, struct sk_buff **skb, return true; } -static void enic_rq_indicate_buf(struct vnic_rq *rq, - struct cq_desc *cq_desc, struct vnic_rq_buf *buf, - int skipped, void *opaque) +void enic_rq_indicate_buf(struct vnic_rq *rq, struct cq_desc *cq_desc, + struct vnic_rq_buf *buf, int skipped, void *opaque) { struct enic *enic = vnic_dev_priv(rq->vdev); struct net_device *netdev = enic->netdev; @@ -1406,7 +1396,6 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, u8 packet_error; u16 q_number, completed_index, bytes_written, vlan_tci, checksum; u32 rss_hash; - bool outer_csum_ok = true, encap = false; rqstats->packets++; if (skipped) { @@ -1426,15 +1415,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, &ipv4_csum_ok, &ipv6, &ipv4, &ipv4_fragment, &fcs_ok); - if (packet_error) { - - if (!fcs_ok) { - if (bytes_written > 0) - rqstats->bad_fcs++; - else if (bytes_written == 0) - rqstats->pkt_truncated++; - } - + if (enic_rq_pkt_error(rq, packet_error, fcs_ok, bytes_written)) { dma_unmap_single(&enic->pdev->dev, buf->dma_addr, buf->len, DMA_FROM_DEVICE); dev_kfree_skb_any(skb); @@ -1458,66 +1439,11 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, skb_put(skb, bytes_written); skb->protocol = eth_type_trans(skb, netdev); skb_record_rx_queue(skb, q_number); - if ((netdev->features & NETIF_F_RXHASH) && rss_hash && - (type == 3)) { - switch (rss_type) { - case CQ_ENET_RQ_DESC_RSS_TYPE_TCP_IPv4: - case CQ_ENET_RQ_DESC_RSS_TYPE_TCP_IPv6: - case CQ_ENET_RQ_DESC_RSS_TYPE_TCP_IPv6_EX: - skb_set_hash(skb, rss_hash, PKT_HASH_TYPE_L4); - rqstats->l4_rss_hash++; - break; - case CQ_ENET_RQ_DESC_RSS_TYPE_IPv4: - case CQ_ENET_RQ_DESC_RSS_TYPE_IPv6: - case CQ_ENET_RQ_DESC_RSS_TYPE_IPv6_EX: - skb_set_hash(skb, rss_hash, PKT_HASH_TYPE_L3); - rqstats->l3_rss_hash++; - break; - } - } - if (enic->vxlan.vxlan_udp_port_number) { - switch (enic->vxlan.patch_level) { - case 0: - if (fcoe) { - encap = true; - outer_csum_ok = fcoe_fc_crc_ok; - } - break; - case 2: - if ((type == 7) && - (rss_hash & BIT(0))) { - encap = true; - outer_csum_ok = (rss_hash & BIT(1)) && - (rss_hash & BIT(2)); - } - break; - } - } - /* Hardware does not provide whole packet checksum. It only - * provides pseudo checksum. Since hw validates the packet - * checksum but not provide us the checksum value. use - * CHECSUM_UNNECESSARY. - * - * In case of encap pkt tcp_udp_csum_ok/tcp_udp_csum_ok is - * inner csum_ok. outer_csum_ok is set by hw when outer udp - * csum is correct or is zero. - */ - if ((netdev->features & NETIF_F_RXCSUM) && !csum_not_calc && - tcp_udp_csum_ok && outer_csum_ok && - (ipv4_csum_ok || ipv6)) { - skb->ip_summed = CHECKSUM_UNNECESSARY; - skb->csum_level = encap; - if (encap) - rqstats->csum_unnecessary_encap++; - else - rqstats->csum_unnecessary++; - } + enic_rq_set_skb_flags(rq, type, rss_hash, rss_type, fcoe, fcoe_fc_crc_ok, + vlan_stripped, csum_not_calc, tcp_udp_csum_ok, ipv6, + ipv4_csum_ok, vlan_tci, skb); - if (vlan_stripped) { - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci); - rqstats->vlan_stripped++; - } skb_mark_napi_id(skb, &enic->napi[rq->index]); if (!(netdev->features & NETIF_F_GRO)) netif_receive_skb(skb); @@ -1538,18 +1464,6 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, } } -static int enic_rq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, - u8 type, u16 q_number, u16 completed_index, void *opaque) -{ - struct enic *enic = vnic_dev_priv(vdev); - - vnic_rq_service(&enic->rq[q_number].vrq, cq_desc, - completed_index, VNIC_RQ_RETURN_DESC, - enic_rq_indicate_buf, opaque); - - return 0; -} - static void enic_set_int_moderation(struct enic *enic, struct vnic_rq *rq) { unsigned int intr = enic_msix_rq_intr(enic, rq->index); diff --git a/drivers/net/ethernet/cisco/enic/enic_rq.c b/drivers/net/ethernet/cisco/enic/enic_rq.c new file mode 100644 index 000000000000..571af8f31470 --- /dev/null +++ b/drivers/net/ethernet/cisco/enic/enic_rq.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Copyright 2024 Cisco Systems, Inc. All rights reserved. + +#include +#include +#include "enic.h" +#include "enic_rq.h" +#include "vnic_rq.h" +#include "cq_enet_desc.h" + +#define ENIC_LARGE_PKT_THRESHOLD 1000 + +void enic_intr_update_pkt_size(struct vnic_rx_bytes_counter *pkt_size, + u32 pkt_len) +{ + if (pkt_len >= ENIC_LARGE_PKT_THRESHOLD) + pkt_size->large_pkt_bytes_cnt += pkt_len; + else + pkt_size->small_pkt_bytes_cnt += pkt_len; +} + +void enic_rq_set_skb_flags(struct vnic_rq *vrq, u8 type, u32 rss_hash, u8 rss_type, u8 fcoe, + u8 fcoe_fc_crc_ok, u8 vlan_stripped, u8 csum_not_calc, + u8 tcp_udp_csum_ok, u8 ipv6, u8 ipv4_csum_ok, u16 vlan_tci, + struct sk_buff *skb) +{ + struct enic *enic = vnic_dev_priv(vrq->vdev); + struct net_device *netdev = enic->netdev; + struct enic_rq_stats *rqstats = &enic->rq[vrq->index].stats; + bool outer_csum_ok = true, encap = false; + + if ((netdev->features & NETIF_F_RXHASH) && rss_hash && type == 3) { + switch (rss_type) { + case CQ_ENET_RQ_DESC_RSS_TYPE_TCP_IPv4: + case CQ_ENET_RQ_DESC_RSS_TYPE_TCP_IPv6: + case CQ_ENET_RQ_DESC_RSS_TYPE_TCP_IPv6_EX: + skb_set_hash(skb, rss_hash, PKT_HASH_TYPE_L4); + rqstats->l4_rss_hash++; + break; + case CQ_ENET_RQ_DESC_RSS_TYPE_IPv4: + case CQ_ENET_RQ_DESC_RSS_TYPE_IPv6: + case CQ_ENET_RQ_DESC_RSS_TYPE_IPv6_EX: + skb_set_hash(skb, rss_hash, PKT_HASH_TYPE_L3); + rqstats->l3_rss_hash++; + break; + } + } + if (enic->vxlan.vxlan_udp_port_number) { + switch (enic->vxlan.patch_level) { + case 0: + if (fcoe) { + encap = true; + outer_csum_ok = fcoe_fc_crc_ok; + } + break; + case 2: + if (type == 7 && (rss_hash & BIT(0))) { + encap = true; + outer_csum_ok = (rss_hash & BIT(1)) && + (rss_hash & BIT(2)); + } + break; + } + } + + /* Hardware does not provide whole packet checksum. It only + * provides pseudo checksum. Since hw validates the packet + * checksum but not provide us the checksum value. use + * CHECSUM_UNNECESSARY. + * + * In case of encap pkt tcp_udp_csum_ok/tcp_udp_csum_ok is + * inner csum_ok. outer_csum_ok is set by hw when outer udp + * csum is correct or is zero. + */ + if ((netdev->features & NETIF_F_RXCSUM) && !csum_not_calc && + tcp_udp_csum_ok && outer_csum_ok && (ipv4_csum_ok || ipv6)) { + skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->csum_level = encap; + if (encap) + rqstats->csum_unnecessary_encap++; + else + rqstats->csum_unnecessary++; + } + + if (vlan_stripped) { + __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci); + rqstats->vlan_stripped++; + } +} + +int enic_rq_pkt_error(struct vnic_rq *vrq, u8 packet_error, u8 fcs_ok, u16 bytes_written) +{ + struct enic *enic = vnic_dev_priv(vrq->vdev); + struct enic_rq_stats *rqstats = &enic->rq[vrq->index].stats; + int ret = 0; + + if (packet_error) { + if (!fcs_ok) { + if (bytes_written > 0) { + rqstats->bad_fcs++; + ret = 1; + } else if (bytes_written == 0) { + rqstats->pkt_truncated++; + ret = 2; + } + } + } + return ret; +} + +int enic_rq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, + u8 type, u16 q_number, u16 completed_index, void *opaque) +{ + struct enic *enic = vnic_dev_priv(vdev); + + vnic_rq_service(&enic->rq[q_number].vrq, cq_desc, completed_index, + VNIC_RQ_RETURN_DESC, enic_rq_indicate_buf, opaque); + + return 0; +} diff --git a/drivers/net/ethernet/cisco/enic/enic_rq.h b/drivers/net/ethernet/cisco/enic/enic_rq.h new file mode 100644 index 000000000000..46ab75fd74a0 --- /dev/null +++ b/drivers/net/ethernet/cisco/enic/enic_rq.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright 2008-2010 Cisco Systems, Inc. All rights reserved. + * Copyright 2007 Nuova Systems, Inc. All rights reserved. + */ + +#ifndef _ENIC_RQ_H_ +#define _ENIC_RQ_H_ + +void enic_intr_update_pkt_size(struct vnic_rx_bytes_counter *pkt_size, + u32 pkt_len); +void enic_rq_set_skb_flags(struct vnic_rq *rq, u8 type, u32 rss_hash, u8 rss_type, + u8 fcoe, u8 fcoe_fc_crc_ok, u8 vlan_stripped, + u8 csum_not_calc, u8 tcp_udp_csum_ok, u8 ipv6, + u8 ipv4_csum_ok, u16 vlan_tci, struct sk_buff *skb); +int enic_rq_pkt_error(struct vnic_rq *rq, u8 packet_error, u8 fcs_ok, + u16 bytes_written); +int enic_rq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, + u8 type, u16 q_number, u16 completed_index, void *opaque); +void enic_rq_indicate_buf(struct vnic_rq *rq, struct cq_desc *cq_desc, + struct vnic_rq_buf *buf, int skipped, void *opaque); +#endif /* _ENIC_RQ_H_ */ From patchwork Fri Jan 10 23:32:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Daley X-Patchwork-Id: 13935593 X-Patchwork-Delegate: kuba@kernel.org Received: from rcdn-iport-7.cisco.com (rcdn-iport-7.cisco.com [173.37.86.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB25B24B23F for ; Fri, 10 Jan 2025 23:34:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=173.37.86.78 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736552064; cv=none; b=kT5DcVtj8V/S5Y9ejrYUcQu+TSCOZDDlW+fZAFDeDxytVYgvXvInskUqrQOwQhoLgZqsIDEY1ex6ot0UkV4eVHRjQfZm3ADVgA64UsBdh0te+GcbktmiJGm1QLmMBFjwsl+swbItLynqord1PxxnjOWeeGWtOSN4HVgvJ1x1qtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736552064; c=relaxed/simple; bh=uH5xy4ZRJvldT/+YPhPTlJm4jZDopPH+Xm7opbQ7/as=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LLao45/VSU4QRWLHjdUFVdPbc66xQtn84IG4gI/Owj9G/dO4Sr8H2xpWRfd8urAeutvzNwyU0kbjhNLCwy6cc5OL1oO9GG+IlUjthiPE9yYD/hgYYSmgwHO2nB6qNCHOmlmNyOMU4iVj3r3o1v+OxpqTXZhaP4eM8+huyVKdqS4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com; spf=pass smtp.mailfrom=cisco.com; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b=brh7oudw; arc=none smtp.client-ip=173.37.86.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cisco.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b="brh7oudw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.com; i=@cisco.com; l=2535; q=dns/txt; s=iport; t=1736552062; x=1737761662; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=HSpELNyVGn5jvpckxKE40zn97qRO2jABqswfGC8qjLE=; b=brh7oudw+WarW0228GgxVEwqhwqdbXXsBOlmjpIOLKm2dxGo3QDgL+IJ jJ5mg27WNt1/r0TQMoJuc66QE3WzFrYdUueShHOK6oC0ospCamV0zDFV3 gOHyXjKasFnDeV5dOTLvApZK//KFM5/XKbtJHIEn1wnuqvsLSPCn3zfWl I=; X-CSE-ConnectionGUID: LhXrjWFcTkm4g1TnDEzYAQ== X-CSE-MsgGUID: jJHcMUvTRz6txzo3q1PtQQ== X-IPAS-Result: A0AnAAD5rYFn/4z/Ja1aHAEBAQEBAQcBARIBAQQEAQGBfwcBAQsBgkqBT0NIjHJfoTCFXYElA1YPAQEBD0QEAQGFBwKKdAImNAkOAQIEAQEBAQMCAwEBAQEBAQEBAQEBCwEBBQEBAQIBBwWBDhOGCIZbAgEDJwsBRhBRKysHEoMBgmUDtFWBeTOBAd4zgW2BSAGFaodfcIR3JxuBSUSCUIE+b4UQhXcEgjKFNZ5USIEhA1ksAVUTDQoLBwWBODoDIgsLDAsUHBUCFR4BEQYQBG1EN4JGaUs6Ag0CNYIeJFiCK4RchEeEVIJLVYJHghR6gRmEA0ADCxgNSBEsNwYOGwY+bgebKDyDbwGBD4IopgeLcpURhCWBY59jGjOqUy6HZJBqIqQlhGaBZzyBWTMaCBsVgyJSGQ+OLRYWvEYlMjwCBwsBAQMJkR4BAQ IronPort-Data: A9a23:g4qXvKpqJAxNHDq9YDqWFFLuCmheBmI6ZBIvgKrLsJaIsI4StFCzt garIBmPPPqLY2r0ct5yYYy09BtS6J+Hx9c1TFE5pCE3RXkU+OPIVI+TRqvS04x+DSFioGZPt Zh2hgzodZhsJpPkjk7zdOCn9T8kiPngqoPUUIbsIjp2SRJvVBAvgBdin/9RqoNziLBVOSvV0 T/Ji5OZYQXNNwJcaDpOtvra8Us355wehRtB1rAATaET1LPhvyF94KI3fcmZM3b+S49IKe+2L 86r5K255G7Q4yA2AdqjlLvhGmVSKlIFFVHT4pb+c/HKbilq/kTe4I5iXBYvQRs/ZwGyojxE4 I4lWapc5useFvakdOw1C3G0GszlVEFM0OevzXOX6aR/w6BaGpfh660GMa04AWEX0sJ3MXtMy tITFDMIMh/au+Sa7aCKY9A506zPLOGzVG8ekmtrwTecCbMtRorOBv2Ro9RZxzw3wMtJGJ4yZ eJANmEpN0uGOUASfA5LUPrSn8/w7pX7Wz9fqFSZrK46y2PS1wd2lrPqNbI5f/TRHZkKwBrJ/ DiuE2LRADM6P/mi1wa/4Cywlv3IxjqiYJ4rLejtnhJtqBjJroAJMzUaXEW2pNG1g1CzXtZYJ VBS/CcyxYA/+FGuR8vwQzW3p3mLuhNaUN1Ve8U59QuE4qnZ+QCUAi4DVDEpQNUguNU7Wn8s2 0OFks3BASFptvueSRq17r6eoDWzETIYIW8LeWkPSg5ty9/uvI0+kDrRQdt5Vq24lNv4HXf32 T/ikcQlr68YgchO0+Cw+krKxmr34JPIVQUyoA7QWwpJ8z9EWWJsXKTwgXCz0BqKBNzxooWp1 JTcp/Wj0Q== IronPort-HdrOrdr: A9a23:Z2tjzKmnRzl7AviU5t1IlcU7LCHpDfIr3DAbv31ZSRFFG/FwWf rAoB19726StN9/YhAdcLy7VZVoBEmsl6KdgrNhWYtKIjOHhILAFugLhuHfKn/bakjDH4Vmu5 uIHZITNDSJNykYsS4/izPIaurJB7K8gcaVuds= X-Talos-CUID: 9a23:GhqMX260KYXItBvevNss0E4kAMIaXHbhz3KMLBaED0pEWoy8cArF X-Talos-MUID: 9a23:VdVpWwmhX4Z+IYkQMLzddnpgFudjxpmwNHofz4kWqc7fLHVIJw6k2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,305,1728950400"; d="scan'208";a="304764922" Received: from rcdn-l-core-03.cisco.com ([173.37.255.140]) by rcdn-iport-7.cisco.com with ESMTP/TLS/TLS_AES_256_GCM_SHA384; 10 Jan 2025 23:32:53 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-l-core-03.cisco.com (Postfix) with ESMTP id 143EE180001FA; Fri, 10 Jan 2025 23:32:53 +0000 (GMT) Received: by cisco.com (Postfix, from userid 392789) id E34EF20F2005; Fri, 10 Jan 2025 15:32:52 -0800 (PST) From: John Daley To: benve@cisco.com, satishkh@cisco.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org Cc: John Daley , Nelson Escobar Subject: [PATCH net-next v5 2/4] enic: Remove an unnecessary parameter from function enic_queue_rq_desc Date: Fri, 10 Jan 2025 15:32:47 -0800 Message-Id: <20250110233249.23258-3-johndale@cisco.com> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20250110233249.23258-1-johndale@cisco.com> References: <20250110233249.23258-1-johndale@cisco.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-l-core-03.cisco.com X-Patchwork-Delegate: kuba@kernel.org The function enic_queue_rq_desc has a parameter os_buf_index which was only called with a hard coded 0. Remove it. No functional change. Co-developed-by: Nelson Escobar Signed-off-by: Nelson Escobar Co-developed-by: Satish Kharat Signed-off-by: Satish Kharat Signed-off-by: John Daley --- drivers/net/ethernet/cisco/enic/enic_main.c | 8 ++------ drivers/net/ethernet/cisco/enic/enic_res.h | 10 +++------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 2a1448e98466..fd3d34c1d4d4 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -1332,14 +1332,11 @@ static int enic_rq_alloc_buf(struct vnic_rq *rq) struct net_device *netdev = enic->netdev; struct sk_buff *skb; unsigned int len = netdev->mtu + VLAN_ETH_HLEN; - unsigned int os_buf_index = 0; dma_addr_t dma_addr; struct vnic_rq_buf *buf = rq->to_use; if (buf->os_buf) { - enic_queue_rq_desc(rq, buf->os_buf, os_buf_index, buf->dma_addr, - buf->len); - + enic_queue_rq_desc(rq, buf->os_buf, buf->dma_addr, buf->len); return 0; } skb = netdev_alloc_skb_ip_align(netdev, len); @@ -1355,8 +1352,7 @@ static int enic_rq_alloc_buf(struct vnic_rq *rq) return -ENOMEM; } - enic_queue_rq_desc(rq, skb, os_buf_index, - dma_addr, len); + enic_queue_rq_desc(rq, skb, dma_addr, len); return 0; } diff --git a/drivers/net/ethernet/cisco/enic/enic_res.h b/drivers/net/ethernet/cisco/enic/enic_res.h index b8ee42d297aa..dad5c45b684a 100644 --- a/drivers/net/ethernet/cisco/enic/enic_res.h +++ b/drivers/net/ethernet/cisco/enic/enic_res.h @@ -107,19 +107,15 @@ static inline void enic_queue_wq_desc_tso(struct vnic_wq *wq, } static inline void enic_queue_rq_desc(struct vnic_rq *rq, - void *os_buf, unsigned int os_buf_index, - dma_addr_t dma_addr, unsigned int len) + void *os_buf, dma_addr_t dma_addr, unsigned int len) { struct rq_enet_desc *desc = vnic_rq_next_desc(rq); - u64 wrid = 0; - u8 type = os_buf_index ? - RQ_ENET_TYPE_NOT_SOP : RQ_ENET_TYPE_ONLY_SOP; rq_enet_desc_enc(desc, (u64)dma_addr | VNIC_PADDR_TARGET, - type, (u16)len); + RQ_ENET_TYPE_ONLY_SOP, (u16)len); - vnic_rq_post(rq, os_buf, os_buf_index, dma_addr, len, wrid); + vnic_rq_post(rq, os_buf, 0, dma_addr, len, 0); } struct enic; From patchwork Fri Jan 10 23:32:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Daley X-Patchwork-Id: 13935591 X-Patchwork-Delegate: kuba@kernel.org Received: from rcdn-iport-1.cisco.com (rcdn-iport-1.cisco.com [173.37.86.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2A20222572 for ; Fri, 10 Jan 2025 23:32:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=173.37.86.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736551981; cv=none; b=OLh1kKQHiAdXL8NqFFe2lq+CGUo07uomYEnriSTR72SBWsAvN4skW2OKg/HpBEQm1T0QigexFwJOOtjv8yrWToBYmd+ieynR8vpgaRKz4th+ma872fD9awUvgGWpAFOVp+9dC7ZriMH8h9Py9vEJcid6SrSms+qt9XcoilB81dc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736551981; c=relaxed/simple; bh=arGXb5Rus1cUc0CwA06aBsGq1d5jQ96aor8Qrc5jpOc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=L8hi11RrQb+eU1DsWCbzhtDRvNub/xyWzXYIjnG7J5LNi5lW1VdQVYPDtVhkN84fzz+IjmF+DxROZ3gsg2Y6+itHcdQ73xDjasxWhxjiviPUOODT9AFOEECj141EItCirlYDWr6SFOFvXw+q/NhEmZy68wbEeYeL/kLdyUmZiqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com; spf=pass smtp.mailfrom=cisco.com; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b=JnvKXU7Y; arc=none smtp.client-ip=173.37.86.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cisco.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b="JnvKXU7Y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.com; i=@cisco.com; l=4447; q=dns/txt; s=iport; t=1736551979; x=1737761579; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=XtwlElowJ1XLKo9eSWoN9x2HL1wNbegz7k2yKy69syY=; b=JnvKXU7YhtjPj8AbMBNK6IXyVUCXbcX6facxPNdsSrF/yrwtFhxJgXUj EuhnLI005EEHqvH+VRd9XxxLGBcRaPwlwwbv5CLScL7/PWqW40FaVJ0KU PiCDH/QiY1eoAE1FsmGrT5H2niOF+kGS4bJQxIk+e4d3trB80W0giU8bw o=; X-CSE-ConnectionGUID: uPS7pxIERp60vlphbLfa3w== X-CSE-MsgGUID: 0kKjGZBGQUG2OZID7SbKMw== X-IPAS-Result: A0ANAAD8rIFn/47/Ja1aGwEBAQEBAQEBBQEBARIBAQEDAwEBAYF/BgEBAQsBgkqBT0NIjHJfiHKeGxSBEQNWDwEBAQ9EBAEBhQcCinQCJjQJDgECBAEBAQEDAgMBAQEBAQEBAQEBAQsBAQUBAQECAQcFgQ4ThgiGWwIBAycLAUYQUSsrBxKDAYJlA7RNgXkzgQHeM4FtgUgBhWqHX3CEdycbgUlEglCBPm+EKoZdBIIyhTWeUkiBIQNZLAFVEw0KCwcFgTg6AyILCwwLFBwVAhUfEQYQBG1EN4JGaUs6Ag0CNYIeJFiCK4RchEeEVIJLVYJHghR6gRmEAUADCxgNSBEsNwYOGwY+bgebJzyDbgGBDxOCADEkApMVG5IVgTSKPpURhCWBY59jGjOqU5gDeSKjVVCEZoFnPIFZMxoIGxWDIlIZD4hchVEWFrxGJTI8AgcLAQEDCZA+YAEB IronPort-Data: A9a23:beXn7ahgonrJey2kuiUfD/lhX161QhEKZh0ujC45NGQN5FlHY01je htvX2GHaK3ZZGXzLo9wa9/l8R9TvcXXyIIwGQpvrihmESJjpJueD7x1DKtf0wB+jyHnZBg6h ynLQoCYdKjYdleF+FH1dOCn9SQkvU2xbuKUIPbePSxsThNTRi4kiBZy88Y0mYcAbeKRW2thg vus5ZSFULOZ82QsaD9Msvvb8EgHUMna4Vv0gHRvPZing3eG/5UlJMp3Db28KXL+Xr5VEoaSL 87fzKu093/u5BwkDNWoiN7TKiXmlZaLYGBiIlIPM0STqkAqSh4ai87XB9JAAatjsAhlqvgqo Dl7WTNcfi9yVkHEsLx1vxC1iEiSN4UekFPMCSDXXcB+UyQqflO0q8iCAn3aMqUFwt0oGXFv2 MYAdmgTagiDjca4yemkH7wEasQLdKEHPasFsX1miDWcBvE8TNWbHuPB5MRT23E7gcUm8fT2P pVCL2EwKk6dPlsWZg1/5JEWxI9EglH9dD1epFuRqII84nPYy0p6172F3N/9IYTWFZ0Jxh3Hz o7A1zz6IRM1Bvaw8AeqqFWep8OQpinYfZ1HQdVU8dYv2jV/3Fc7BBQIWF6TrfCnh0u6XNxDb UoZ5kIGoKQv8UW5Q8XVUBq/r3qJ+BUbXrJ4EPAw4SmOx7DS7gLfAXILJhZIbtA8udB1QzE22 lKXt9f0Azopu739YWqU/LqSrBuoNCQVJHNEbigBJSMD7sXvrZ8bkB3CVJBgHbSzg9mzHiv/q w1mtwAkjLkVyMpO3KKh8BWf3nSnp4PCSUg+4QC/sn+Z0z6VrbWNP+SAgWU3J94aRGpFZjFtZ EQ5pvU= IronPort-HdrOrdr: A9a23:JvqOMqEiJbfyQmtFpLqE78eALOsnbusQ8zAXPo5KJiC9Ffbo8P xG88576faZslsssTQb6LK90cq7MBfhHOBOgbX5VI3KNGKNhILrFvAG0WKI+VPd8kPFmtK1rZ 0QEJSXzLbLfCFHZQGQ2njfL+od X-Talos-CUID: 9a23:cOsdd2ihidGs3xLjR8AbsW2AszJub0Xmk2/AAmKCETgxVrmNSVW09qo/jJ87 X-Talos-MUID: 9a23:j2dk0AuwCl9vGC8XLs2n3DJBNuhayYuXNW9Xtqcnl5a/Pw9VJGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,305,1728950400"; d="scan'208";a="304804037" Received: from rcdn-l-core-05.cisco.com ([173.37.255.142]) by rcdn-iport-1.cisco.com with ESMTP/TLS/TLS_AES_256_GCM_SHA384; 10 Jan 2025 23:32:53 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-l-core-05.cisco.com (Postfix) with ESMTP id 1B1231800023B; Fri, 10 Jan 2025 23:32:53 +0000 (GMT) Received: by cisco.com (Postfix, from userid 392789) id E9F2B20F2006; Fri, 10 Jan 2025 15:32:52 -0800 (PST) From: John Daley To: benve@cisco.com, satishkh@cisco.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org Cc: John Daley , Nelson Escobar Subject: [PATCH net-next v5 3/4] enic: Use function pointers for buf alloc, free and RQ service Date: Fri, 10 Jan 2025 15:32:48 -0800 Message-Id: <20250110233249.23258-4-johndale@cisco.com> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20250110233249.23258-1-johndale@cisco.com> References: <20250110233249.23258-1-johndale@cisco.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-l-core-05.cisco.com X-Patchwork-Delegate: kuba@kernel.org In order to support more than one packet receive processing scheme, use pointers for allocate, free and RQ descrptor processing functions. No functional change. Co-developed-by: Nelson Escobar Signed-off-by: Nelson Escobar Co-developed-by: Satish Kharat Signed-off-by: Satish Kharat Signed-off-by: John Daley --- drivers/net/ethernet/cisco/enic/enic.h | 5 +++++ drivers/net/ethernet/cisco/enic/enic_main.c | 14 +++++++++----- drivers/net/ethernet/cisco/enic/enic_rq.c | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h index 10b7e02ba4d0..51f80378d928 100644 --- a/drivers/net/ethernet/cisco/enic/enic.h +++ b/drivers/net/ethernet/cisco/enic/enic.h @@ -226,6 +226,11 @@ struct enic { u32 rx_copybreak; u8 rss_key[ENIC_RSS_LEN]; struct vnic_gen_stats gen_stats; + void (*rq_buf_service)(struct vnic_rq *rq, struct cq_desc *cq_desc, + struct vnic_rq_buf *buf, int skipped, + void *opaque); + int (*rq_alloc_buf)(struct vnic_rq *rq); + void (*rq_free_buf)(struct vnic_rq *rq, struct vnic_rq_buf *buf); }; static inline struct net_device *vnic_get_netdev(struct vnic_dev *vdev) diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index fd3d34c1d4d4..d3319f62ad1b 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -1550,7 +1550,7 @@ static int enic_poll(struct napi_struct *napi, int budget) 0 /* don't unmask intr */, 0 /* don't reset intr timer */); - err = vnic_rq_fill(&enic->rq[0].vrq, enic_rq_alloc_buf); + err = vnic_rq_fill(&enic->rq[0].vrq, enic->rq_alloc_buf); /* Buffer allocation failed. Stay in polling * mode so we can try to fill the ring again. @@ -1678,7 +1678,7 @@ static int enic_poll_msix_rq(struct napi_struct *napi, int budget) 0 /* don't unmask intr */, 0 /* don't reset intr timer */); - err = vnic_rq_fill(&enic->rq[rq].vrq, enic_rq_alloc_buf); + err = vnic_rq_fill(&enic->rq[rq].vrq, enic->rq_alloc_buf); /* Buffer allocation failed. Stay in polling mode * so we can try to fill the ring again. @@ -1883,6 +1883,10 @@ static int enic_open(struct net_device *netdev) unsigned int i; int err, ret; + enic->rq_buf_service = enic_rq_indicate_buf; + enic->rq_alloc_buf = enic_rq_alloc_buf; + enic->rq_free_buf = enic_free_rq_buf; + err = enic_request_intr(enic); if (err) { netdev_err(netdev, "Unable to request irq.\n"); @@ -1901,7 +1905,7 @@ static int enic_open(struct net_device *netdev) for (i = 0; i < enic->rq_count; i++) { /* enable rq before updating rq desc */ vnic_rq_enable(&enic->rq[i].vrq); - vnic_rq_fill(&enic->rq[i].vrq, enic_rq_alloc_buf); + vnic_rq_fill(&enic->rq[i].vrq, enic->rq_alloc_buf); /* Need at least one buffer on ring to get going */ if (vnic_rq_desc_used(&enic->rq[i].vrq) == 0) { netdev_err(netdev, "Unable to alloc receive buffers\n"); @@ -1940,7 +1944,7 @@ static int enic_open(struct net_device *netdev) for (i = 0; i < enic->rq_count; i++) { ret = vnic_rq_disable(&enic->rq[i].vrq); if (!ret) - vnic_rq_clean(&enic->rq[i].vrq, enic_free_rq_buf); + vnic_rq_clean(&enic->rq[i].vrq, enic->rq_free_buf); } enic_dev_notify_unset(enic); err_out_free_intr: @@ -1999,7 +2003,7 @@ static int enic_stop(struct net_device *netdev) for (i = 0; i < enic->wq_count; i++) vnic_wq_clean(&enic->wq[i].vwq, enic_free_wq_buf); for (i = 0; i < enic->rq_count; i++) - vnic_rq_clean(&enic->rq[i].vrq, enic_free_rq_buf); + vnic_rq_clean(&enic->rq[i].vrq, enic->rq_free_buf); for (i = 0; i < enic->cq_count; i++) vnic_cq_clean(&enic->cq[i]); for (i = 0; i < enic->intr_count; i++) diff --git a/drivers/net/ethernet/cisco/enic/enic_rq.c b/drivers/net/ethernet/cisco/enic/enic_rq.c index 571af8f31470..ae2ab5af87e9 100644 --- a/drivers/net/ethernet/cisco/enic/enic_rq.c +++ b/drivers/net/ethernet/cisco/enic/enic_rq.c @@ -114,7 +114,7 @@ int enic_rq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, struct enic *enic = vnic_dev_priv(vdev); vnic_rq_service(&enic->rq[q_number].vrq, cq_desc, completed_index, - VNIC_RQ_RETURN_DESC, enic_rq_indicate_buf, opaque); + VNIC_RQ_RETURN_DESC, enic->rq_buf_service, opaque); return 0; } From patchwork Fri Jan 10 23:32:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Daley X-Patchwork-Id: 13935595 X-Patchwork-Delegate: kuba@kernel.org Received: from rcdn-iport-7.cisco.com (rcdn-iport-7.cisco.com [173.37.86.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9AEE4221D86 for ; Fri, 10 Jan 2025 23:34:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=173.37.86.78 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736552066; cv=none; b=Ozd5SQjJAPvKlVtxxZz94dAiQEi9m65Eg/T8FmZYwWGGwDw3YNoz5CsAwyvTGdqO6cY2jffOWN2Tum1v/g+JKDm68AilwKCubSWP/2vkep04ILqfUFDF6KJFya2peU7/PbT29mMiPIKe2P+c3jlYmV4DmKjTCdgGr8NVXxC9r0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736552066; c=relaxed/simple; bh=biBIfFqV7edhp9Ts2kkfDATDLpg2ynqjrtq9Q+z1sH4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Vo3QrV30jGBs5TiiJ8+c67j3+RObOGhbwH4PZcTleW7bZ9L9V8dHpch0JCbGh7q6sUIjOhg2bSUFihczaErku2y5NQJ7+xm9ezoGW3dIxhuNH6IubofOrlj5LT3tpMrnCG+feMLP2AEadUyfxpIX6CUtqPc6qaxKNXjEDAPoTkc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com; spf=pass smtp.mailfrom=cisco.com; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b=dKC8nGfD; arc=none smtp.client-ip=173.37.86.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cisco.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cisco.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=cisco.com header.i=@cisco.com header.b="dKC8nGfD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.com; i=@cisco.com; l=11417; q=dns/txt; s=iport; t=1736552064; x=1737761664; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UC0WnjeBW6PrMAOR+T/12J3J/Z2IiJpNiyWkLzisbnU=; b=dKC8nGfDD+BRjABp15kETN8bHslU5sDvF1qAyNEqcgEqeepZNPAOtSbT KZjJLdo1bDJEjVIdMlExMxYOluvYVw2U6emLj7OjgtYGoUz6l/1usC4rB WmyBSvDXisIZVL4VfkXFQWnmxZ2NXev4IH9SgC08KSjSHhGmiA8hGWlSb 4=; X-CSE-ConnectionGUID: 6EN0lzqfR6G9HYsQS5v6FA== X-CSE-MsgGUID: 5V5rK67mTYuiT/D0YmG2hw== X-IPAS-Result: A0AnAAD5rYFn/5H/Ja1aHAEBAQEBAQcBARIBAQQEAQGBfwcBAQsBgkqBT0NIjHJfpw2BJQNWDwEBAQ9EBAEBhQcCinQCJjQJDgECBAEBAQEDAgMBAQEBAQEBAQEBAQsBAQUBAQECAQcFgQ4ThgiGWwIBAycLAUYQUSsrBxKDAYJlA7RVgXkzgQHeM4FtgUgBhWqHX3CEdycbgUlEgRWBO4E+b4sHBIdnnlRIgSEDWSwBVRMNCgsHBYE4OgMiCwsMCxQcFQIVHgERBhAEbUQ3gkZpSzoCDQI1gh4kWIIrhFyER4RUgktVgkeCFHqBGYQDQAMLGA1IESw3Bg4bBj5uB5soPINwexSBJoFEoyWCIKEDhCWBY59jGjOqU5h8IqQlhGaBZzyBWTMaCBsVgyJSGQ+OKgMWFrxGJTI8AgcLAQEDCZEeAQE IronPort-Data: A9a23:Cv5ph6NPcBUNk7DvrR2HlsFynXyQoLVcMsEvi/4bfWQNrUomhWQGy mRJW2uDPP/ZZWOnedBwPNmxpxtTscKHndE2HHM5pCpnJ55oRWUpJjg4wmPYZX76whjrFRo/h ykmQoCeaphyFjmE+0/F3oHJ9RFUzbuPSqf3FNnKMyVwQR4MYCo6gHqPocZh6mJTqYb/WlnlV e/a+ZWFZQf8gmYsaQr41orawP9RlKWq0N8nlgRWicBj5Df2i3QTBZQDEqC9R1OQapVUBOOzW 9HYx7i/+G7Dlz91Yj9yuu+mGqGiaue60Tmm0hK6aYD76vRxjnBaPpIACRYpQRw/ZwNlMDxG4 I4lWZSYEW/FN0BX8QgXe0Ew/ypWZcWq9FJbSJSymZT78qHIT5fj66tDKhkyL5QWwLhYUEF/7 sUjdS5TQDnW0opawJrjIgVtrt4oIM+uOMYUvWttiGmJS/0nWpvEBa7N4Le03h9p2ZsIRqmYP ZdEL2MzMXwsYDUXUrsTIJA5nOGkj33yWzZZs1mS46Ew5gA/ySQqiOSyboaEIIDiqcN9w3jFv EGYoGHFMwwbCJuzkQuA3Sismbqa9c/8cMdIfFGizdZmiUOew0QfAQMbUF+8r+X/jEOiM/pSJ 1ER8zgjsYA980ukStS7VBq9yFaHoxQVc9ldCes37EeK0KW8yw+fCnIJUX1HZcAqudEeQSEs0 BmCn7vBHTVlvbuUYWiQ+redsXW5Pi19BWkPeSMJUyMb7NT55oI+lBTCSpBkCqHdszHuMSv7z zbPqG01gK8eyJZbka665lvAxTmro/AlUzII2+keZUr9hisRWWJvT9fABYTzhRqYELukcw== IronPort-HdrOrdr: A9a23:uqiIsq6JCMqwZWFePgPXwM/XdLJyesId70hD6qm+c3Nom6uj5q eTdZsgtCMc5Ax9ZJhko6HjBEDiewK5yXcK2+ks1N6ZNWGM0ldAbrsSiLcKqAePJ8SRzIJgPN 9bAstD4BmaNykCsS48izPIdeod/A== X-Talos-CUID: 9a23:LNQ3x2BhAc13I1r6E3dK0hYQCNkrSCPynVfhOHaDVHg3ZpTAHA== X-Talos-MUID: 9a23:7s/sFghbmg5AsJFrNKWxDMMpafk1+YfwV0UxoIgHh46obR11FG2dk2Hi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,305,1728950400"; d="scan'208";a="304764924" Received: from rcdn-l-core-08.cisco.com ([173.37.255.145]) by rcdn-iport-7.cisco.com with ESMTP/TLS/TLS_AES_256_GCM_SHA384; 10 Jan 2025 23:32:53 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-l-core-08.cisco.com (Postfix) with ESMTP id 23D48180001E8; Fri, 10 Jan 2025 23:32:53 +0000 (GMT) Received: by cisco.com (Postfix, from userid 392789) id F07E820F2007; Fri, 10 Jan 2025 15:32:52 -0800 (PST) From: John Daley To: benve@cisco.com, satishkh@cisco.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org Cc: John Daley , Nelson Escobar Subject: [PATCH net-next v5 4/4] enic: Use the Page Pool API for RX when MTU is less than page size Date: Fri, 10 Jan 2025 15:32:49 -0800 Message-Id: <20250110233249.23258-5-johndale@cisco.com> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20250110233249.23258-1-johndale@cisco.com> References: <20250110233249.23258-1-johndale@cisco.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: rcdn-l-core-08.cisco.com X-Patchwork-Delegate: kuba@kernel.org The Page Pool API improves bandwidth and CPU overhead by recycling pages instead of allocating new buffers in the driver. Make use of page pool fragment allocation for smaller MTUs so that multiple packets can share a page. Added 'pp_alloc_error' per RQ ethtool statistic to count page_pool_dev_alloc() failures. Co-developed-by: Nelson Escobar Signed-off-by: Nelson Escobar Co-developed-by: Satish Kharat Signed-off-by: Satish Kharat Signed-off-by: John Daley --- drivers/net/ethernet/cisco/enic/enic.h | 10 ++ drivers/net/ethernet/cisco/enic/enic_main.c | 53 ++++++++- drivers/net/ethernet/cisco/enic/enic_rq.c | 123 ++++++++++++++++++++ drivers/net/ethernet/cisco/enic/enic_rq.h | 5 + drivers/net/ethernet/cisco/enic/vnic_rq.h | 2 + 5 files changed, 187 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h index 51f80378d928..19e22aba71a8 100644 --- a/drivers/net/ethernet/cisco/enic/enic.h +++ b/drivers/net/ethernet/cisco/enic/enic.h @@ -17,6 +17,8 @@ #include "vnic_nic.h" #include "vnic_rss.h" #include +#include +#include #define DRV_NAME "enic" #define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver" @@ -158,6 +160,7 @@ struct enic_rq_stats { u64 pkt_truncated; /* truncated pkts */ u64 no_skb; /* out of skbs */ u64 desc_skip; /* Rx pkt went into later buffer */ + u64 pp_alloc_error; /* page alloc error */ }; struct enic_wq { @@ -169,6 +172,7 @@ struct enic_wq { struct enic_rq { struct vnic_rq vrq; struct enic_rq_stats stats; + struct page_pool *pool; } ____cacheline_aligned; /* Per-instance private data structure */ @@ -231,8 +235,14 @@ struct enic { void *opaque); int (*rq_alloc_buf)(struct vnic_rq *rq); void (*rq_free_buf)(struct vnic_rq *rq, struct vnic_rq_buf *buf); + void (*rq_cleanup)(struct enic_rq *rq); }; +static inline unsigned int get_max_pkt_len(struct enic *enic) +{ + return enic->netdev->mtu + VLAN_ETH_HLEN; +} + static inline struct net_device *vnic_get_netdev(struct vnic_dev *vdev) { struct enic *enic = vdev->priv; diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index d3319f62ad1b..64f25a5b1507 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -1313,6 +1313,11 @@ static int enic_get_vf_port(struct net_device *netdev, int vf, return -EMSGSIZE; } +/* nothing to do for buffers based allocation */ +static void enic_rq_buf_cleanup(struct enic_rq *rq) +{ +} + static void enic_free_rq_buf(struct vnic_rq *rq, struct vnic_rq_buf *buf) { struct enic *enic = vnic_dev_priv(rq->vdev); @@ -1882,10 +1887,33 @@ static int enic_open(struct net_device *netdev) struct enic *enic = netdev_priv(netdev); unsigned int i; int err, ret; - - enic->rq_buf_service = enic_rq_indicate_buf; - enic->rq_alloc_buf = enic_rq_alloc_buf; - enic->rq_free_buf = enic_free_rq_buf; + bool use_page_pool; + struct page_pool_params pp_params = { 0 }; + + /* Use the Page Pool API for MTUs <= PAGE_SIZE */ + use_page_pool = (get_max_pkt_len(enic) <= PAGE_SIZE); + + if (use_page_pool) { + /* use the page pool API */ + pp_params.order = 0; + pp_params.pool_size = enic->config.rq_desc_count; + pp_params.nid = dev_to_node(&enic->pdev->dev); + pp_params.dev = &enic->pdev->dev; + pp_params.dma_dir = DMA_FROM_DEVICE; + pp_params.max_len = PAGE_SIZE; + pp_params.netdev = netdev; + pp_params.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV; + + enic->rq_buf_service = enic_rq_indicate_page; + enic->rq_alloc_buf = enic_rq_alloc_page; + enic->rq_free_buf = enic_rq_free_page; + enic->rq_cleanup = enic_rq_page_cleanup; + } else { + enic->rq_buf_service = enic_rq_indicate_buf; + enic->rq_alloc_buf = enic_rq_alloc_buf; + enic->rq_free_buf = enic_free_rq_buf; + enic->rq_cleanup = enic_rq_buf_cleanup; + } err = enic_request_intr(enic); if (err) { @@ -1903,6 +1931,13 @@ static int enic_open(struct net_device *netdev) } for (i = 0; i < enic->rq_count; i++) { + /* create a page pool for each RQ */ + if (use_page_pool) { + pp_params.napi = &enic->napi[i]; + pp_params.queue_idx = i; + enic->rq[i].pool = page_pool_create(&pp_params); + } + /* enable rq before updating rq desc */ vnic_rq_enable(&enic->rq[i].vrq); vnic_rq_fill(&enic->rq[i].vrq, enic->rq_alloc_buf); @@ -1943,8 +1978,10 @@ static int enic_open(struct net_device *netdev) err_out_free_rq: for (i = 0; i < enic->rq_count; i++) { ret = vnic_rq_disable(&enic->rq[i].vrq); - if (!ret) + if (!ret) { vnic_rq_clean(&enic->rq[i].vrq, enic->rq_free_buf); + enic->rq_cleanup(&enic->rq[i]); + } } enic_dev_notify_unset(enic); err_out_free_intr: @@ -2002,8 +2039,10 @@ static int enic_stop(struct net_device *netdev) for (i = 0; i < enic->wq_count; i++) vnic_wq_clean(&enic->wq[i].vwq, enic_free_wq_buf); - for (i = 0; i < enic->rq_count; i++) + for (i = 0; i < enic->rq_count; i++) { vnic_rq_clean(&enic->rq[i].vrq, enic->rq_free_buf); + enic->rq_cleanup(&enic->rq[i]); + } for (i = 0; i < enic->cq_count; i++) vnic_cq_clean(&enic->cq[i]); for (i = 0; i < enic->intr_count; i++) @@ -2513,6 +2552,7 @@ static void enic_get_queue_stats_rx(struct net_device *dev, int idx, rxs->hw_drop_overruns = rqstats->pkt_truncated; rxs->csum_unnecessary = rqstats->csum_unnecessary + rqstats->csum_unnecessary_encap; + rxs->alloc_fail = rqstats->pp_alloc_error; } static void enic_get_queue_stats_tx(struct net_device *dev, int idx, @@ -2540,6 +2580,7 @@ static void enic_get_base_stats(struct net_device *dev, rxs->hw_drops = 0; rxs->hw_drop_overruns = 0; rxs->csum_unnecessary = 0; + rxs->alloc_fail = 0; txs->bytes = 0; txs->packets = 0; txs->csum_none = 0; diff --git a/drivers/net/ethernet/cisco/enic/enic_rq.c b/drivers/net/ethernet/cisco/enic/enic_rq.c index ae2ab5af87e9..624a0d05f393 100644 --- a/drivers/net/ethernet/cisco/enic/enic_rq.c +++ b/drivers/net/ethernet/cisco/enic/enic_rq.c @@ -7,6 +7,7 @@ #include "enic_rq.h" #include "vnic_rq.h" #include "cq_enet_desc.h" +#include "enic_res.h" #define ENIC_LARGE_PKT_THRESHOLD 1000 @@ -118,3 +119,125 @@ int enic_rq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, return 0; } + +void enic_rq_page_cleanup(struct enic_rq *rq) +{ + page_pool_destroy(rq->pool); +} + +void enic_rq_free_page(struct vnic_rq *vrq, struct vnic_rq_buf *buf) +{ + struct enic *enic = vnic_dev_priv(vrq->vdev); + struct enic_rq *rq = &enic->rq[vrq->index]; + + if (!buf->os_buf) + return; + + page_pool_put_full_page(rq->pool, (struct page *)buf->os_buf, true); + buf->os_buf = NULL; +} + +int enic_rq_alloc_page(struct vnic_rq *vrq) +{ + struct enic *enic = vnic_dev_priv(vrq->vdev); + struct enic_rq *rq = &enic->rq[vrq->index]; + struct enic_rq_stats *rqstats = &rq->stats; + struct vnic_rq_buf *buf = vrq->to_use; + dma_addr_t dma_addr; + struct page *page; + unsigned int offset = 0; + unsigned int len; + unsigned int truesize; + + len = get_max_pkt_len(enic); + truesize = len; + + if (buf->os_buf) { + dma_addr = buf->dma_addr; + } else { + page = page_pool_dev_alloc(rq->pool, &offset, &truesize); + if (unlikely(!page)) { + rqstats->pp_alloc_error++; + return -ENOMEM; + } + buf->os_buf = (void *)page; + buf->offset = offset; + buf->truesize = truesize; + dma_addr = page_pool_get_dma_addr(page) + offset; + } + + enic_queue_rq_desc(vrq, buf->os_buf, dma_addr, len); + + return 0; +} + +void enic_rq_indicate_page(struct vnic_rq *vrq, struct cq_desc *cq_desc, + struct vnic_rq_buf *buf, int skipped, void *opaque) +{ + struct enic *enic = vnic_dev_priv(vrq->vdev); + struct sk_buff *skb; + struct enic_rq *rq = &enic->rq[vrq->index]; + struct enic_rq_stats *rqstats = &rq->stats; + struct vnic_cq *cq = &enic->cq[enic_cq_rq(enic, vrq->index)]; + struct napi_struct *napi; + u8 type, color, eop, sop, ingress_port, vlan_stripped; + u8 fcoe, fcoe_sof, fcoe_fc_crc_ok, fcoe_enc_error, fcoe_eof; + u8 tcp_udp_csum_ok, udp, tcp, ipv4_csum_ok; + u8 ipv6, ipv4, ipv4_fragment, fcs_ok, rss_type, csum_not_calc; + u8 packet_error; + u16 q_number, completed_index, bytes_written, vlan_tci, checksum; + u32 rss_hash; + + if (skipped) { + rqstats->desc_skip++; + return; + } + + if (!buf || !buf->dma_addr) { + net_warn_ratelimited("%s: !buf || !buf->dma_addr!!\n", + enic->netdev->name); + return; + } + + cq_enet_rq_desc_dec((struct cq_enet_rq_desc *)cq_desc, + &type, &color, &q_number, &completed_index, + &ingress_port, &fcoe, &eop, &sop, &rss_type, + &csum_not_calc, &rss_hash, &bytes_written, + &packet_error, &vlan_stripped, &vlan_tci, &checksum, + &fcoe_sof, &fcoe_fc_crc_ok, &fcoe_enc_error, + &fcoe_eof, &tcp_udp_csum_ok, &udp, &tcp, + &ipv4_csum_ok, &ipv6, &ipv4, &ipv4_fragment, + &fcs_ok); + + if (enic_rq_pkt_error(vrq, packet_error, fcs_ok, bytes_written)) + return; + + napi = &enic->napi[vrq->index]; + skb = napi_get_frags(napi); + if (unlikely(!skb)) { + net_warn_ratelimited("%s: skb alloc error rq[%d], desc[%d]\n", + enic->netdev->name, vrq->index, + completed_index); + rqstats->no_skb++; + return; + } + + dma_sync_single_for_cpu(&enic->pdev->dev, buf->dma_addr, bytes_written, + DMA_FROM_DEVICE); + skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, (struct page *)buf->os_buf, + buf->offset, bytes_written, buf->truesize); + + buf->os_buf = NULL; + buf->dma_addr = 0; + buf = buf->next; + + enic_rq_set_skb_flags(vrq, type, rss_hash, rss_type, fcoe, fcoe_fc_crc_ok, + vlan_stripped, csum_not_calc, tcp_udp_csum_ok, ipv6, + ipv4_csum_ok, vlan_tci, skb); + if (enic->rx_coalesce_setting.use_adaptive_rx_coalesce) + enic_intr_update_pkt_size(&cq->pkt_size_counter, skb->len); + skb_mark_for_recycle(skb); + skb_record_rx_queue(skb, vrq->index); + napi_gro_frags(napi); + rqstats->packets++; +} diff --git a/drivers/net/ethernet/cisco/enic/enic_rq.h b/drivers/net/ethernet/cisco/enic/enic_rq.h index 46ab75fd74a0..f429f31b6172 100644 --- a/drivers/net/ethernet/cisco/enic/enic_rq.h +++ b/drivers/net/ethernet/cisco/enic/enic_rq.h @@ -19,4 +19,9 @@ int enic_rq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, u8 type, u16 q_number, u16 completed_index, void *opaque); void enic_rq_indicate_buf(struct vnic_rq *rq, struct cq_desc *cq_desc, struct vnic_rq_buf *buf, int skipped, void *opaque); +void enic_rq_indicate_page(struct vnic_rq *rq, struct cq_desc *cq_desc, + struct vnic_rq_buf *buf, int skipped, void *opaque); +int enic_rq_alloc_page(struct vnic_rq *rq); +void enic_rq_free_page(struct vnic_rq *rq, struct vnic_rq_buf *buf); +void enic_rq_page_cleanup(struct enic_rq *rq); #endif /* _ENIC_RQ_H_ */ diff --git a/drivers/net/ethernet/cisco/enic/vnic_rq.h b/drivers/net/ethernet/cisco/enic/vnic_rq.h index 0bc595abc03b..2ee4be2b9a34 100644 --- a/drivers/net/ethernet/cisco/enic/vnic_rq.h +++ b/drivers/net/ethernet/cisco/enic/vnic_rq.h @@ -61,6 +61,8 @@ struct vnic_rq_buf { unsigned int index; void *desc; uint64_t wr_id; + unsigned int offset; + unsigned int truesize; }; enum enic_poll_state {