All of lore.kernel.org
 help / color / mirror / Atom feed
From: Salil Mehta <salil.mehta@huawei.com>
To: <davem@davemloft.net>
Cc: <salil.mehta@huawei.com>, <yisen.zhuang@huawei.com>,
	<mehta.salil.lnk@gmail.com>, <netdev@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <linuxarm@huawei.com>,
	lipeng <lipeng321@huawei.com>,
	Weiwei Deng <dengweiwei@huawei.com>
Subject: [PATCH net 04/19] net: hns: Change the TX queue selection algorithm
Date: Thu, 30 Mar 2017 16:30:51 +0100	[thread overview]
Message-ID: <20170330153106.14344-5-salil.mehta@huawei.com> (raw)
In-Reply-To: <20170330153106.14344-1-salil.mehta@huawei.com>

From: lipeng <lipeng321@huawei.com>

This patch changes the TX queue selection algorithm from default
to based on tuple {sport,dport,sip,dip}/indirection table
similar to used during RX with Receive Side Scaling.

Signed-off-by: lipeng <lipeng321@huawei.com>
Signed-off-by: Weiwei Deng <dengweiwei@huawei.com>
Reviewed-by: Yisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hnae.h         |  2 +
 drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c |  5 ++
 drivers/net/ethernet/hisilicon/hns/hns_enet.c     | 63 +++++++++++++++++++++++
 3 files changed, 70 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h b/drivers/net/ethernet/hisilicon/hns/hnae.h
index 8016854..85df7c7 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -545,6 +545,8 @@ struct hnae_handle {
 	int vf_id;
 	u32 eport_id;
 	u32 dport_id;	/* v2 tx bd should fill the dport_id */
+	u32 *rss_key;
+	u32 *rss_indir_table;
 	enum hnae_port_type port_type;
 	enum hnae_media_type media_type;
 	struct list_head node;    /* list to hnae_ae_dev->handle_list */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 0a9cdf0..abafa25 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -80,6 +80,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
 	struct hnae_handle *ae_handle;
 	struct ring_pair_cb *ring_pair_cb;
 	struct hnae_vf_cb *vf_cb;
+	struct hns_ppe_cb *ppe_cb;
 
 	dsaf_dev = hns_ae_get_dsaf_dev(dev);
 
@@ -127,11 +128,15 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
 	vf_cb->port_index = port_id;
 	vf_cb->mac_cb = dsaf_dev->mac_cb[port_id];
 
+	ppe_cb = hns_get_ppe_cb(ae_handle);
+
 	ae_handle->phy_if = vf_cb->mac_cb->phy_if;
 	ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
 	ae_handle->if_support = vf_cb->mac_cb->if_support;
 	ae_handle->port_type = vf_cb->mac_cb->mac_type;
 	ae_handle->media_type = vf_cb->mac_cb->media_type;
+	ae_handle->rss_key = ppe_cb->rss_key;
+	ae_handle->rss_indir_table = ppe_cb->rss_indir_table;
 	ae_handle->dport_id = port_id;
 
 	return ae_handle;
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 73ec8c8..646f601 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -40,6 +40,8 @@
 #define SKB_TMP_LEN(SKB) \
 	(((SKB)->transport_header - (SKB)->mac_header) + tcp_hdrlen(SKB))
 
+#define INVALID_TX_RING    0xffff
+
 static void fill_v2_desc(struct hnae_ring *ring, void *priv,
 			 int size, dma_addr_t dma, int frag_end,
 			 int buf_num, enum hns_desc_type type, int mtu)
@@ -1657,17 +1659,78 @@ static void hns_nic_get_stats64(struct net_device *ndev,
 	stats->tx_compressed = ndev->stats.tx_compressed;
 }
 
+static u32 hns_calc_tx_rss(u32 sip, u32 dip, u32 sport, u32 dport, u32 *rss_key)
+{
+	u32 rss = 0;
+	int i;
+	u32 port;
+
+	port = (sport << 16) | dport;
+
+	for (i = 0; i < 32; i++)
+		if (sip & (1 << (31 - i)))
+			rss ^= (rss_key[9] << i) |
+				(u32)((u64)rss_key[8] >> (32 - i));
+
+	for (i = 0; i < 32; i++)
+		if (dip & (1 << (31 - i)))
+			rss ^= (rss_key[8] << i) |
+				(u32)((u64)rss_key[7] >> (32 - i));
+
+	for (i = 0; i < 32; i++)
+		if (port & (1 << (31 - i)))
+			rss ^= (rss_key[7] << i) |
+				(u32)((u64)rss_key[6] >> (32 - i));
+
+	return rss;
+}
+
+/* if tcp or udp, then calc tx ring index */
+static u16 hns_calc_tx_ring_idx(struct hns_nic_priv *priv,
+				struct sk_buff *skb)
+{
+	struct hnae_handle *handle;
+	struct iphdr *iphdr;
+	struct tcphdr *tcphdr;
+	u32 rss;
+	int protocol;
+	u16 ring = INVALID_TX_RING;
+
+	if (skb->protocol == htons(ETH_P_IP)) {
+		iphdr = ip_hdr(skb);
+		protocol = iphdr->protocol;
+		if (protocol == IPPROTO_TCP) {
+			/* because tcp and udp dest and src port is same */
+			tcphdr = tcp_hdr(skb);
+			handle = priv->ae_handle;
+			rss = hns_calc_tx_rss(ntohl(iphdr->daddr),
+					      ntohl(iphdr->saddr),
+					      ntohs(tcphdr->dest),
+					      ntohs(tcphdr->source),
+					      handle->rss_key);
+			ring = handle->rss_indir_table[rss & 0xff] & 0xf;
+		}
+	}
+
+	return ring;
+}
+
 static u16
 hns_nic_select_queue(struct net_device *ndev, struct sk_buff *skb,
 		     void *accel_priv, select_queue_fallback_t fallback)
 {
 	struct ethhdr *eth_hdr = (struct ethhdr *)skb->data;
 	struct hns_nic_priv *priv = netdev_priv(ndev);
+	u16 ring;
 
 	/* fix hardware broadcast/multicast packets queue loopback */
 	if (!AE_IS_VER1(priv->enet_ver) &&
 	    is_multicast_ether_addr(eth_hdr->h_dest))
 		return 0;
+
+	ring = hns_calc_tx_ring_idx(priv, skb);
+	if (ring != INVALID_TX_RING)
+		return ring;
 	else
 		return fallback(ndev, skb);
 }
-- 
2.7.4

  parent reply	other threads:[~2017-03-30 15:36 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-30 15:30 [PATCH net 00/19] net: hns: Misc. HNS Bug Fixes & Code Improvements Salil Mehta
2017-03-30 15:30 ` [PATCH net 01/19] net: hns: Fix the implementation of irq affinity function Salil Mehta
2017-03-30 15:30 ` [PATCH net 02/19] net: hns: Modify GMAC init TX threshold value Salil Mehta
2017-03-30 15:30 ` [PATCH net 03/19] net: hns: Optimize the code for GMAC pad and crc Config Salil Mehta
2017-03-30 15:30 ` Salil Mehta [this message]
2017-03-30 15:30 ` [PATCH net 05/19] net: hns: Remove redundant memset during buffer release Salil Mehta
2017-03-30 15:30 ` [PATCH net 06/19] net: hns: bug fix of ethtool show the speed Salil Mehta
2017-03-30 15:30 ` [PATCH net 07/19] net: hns: Optimize hns_nic_common_poll for better performance Salil Mehta
2017-03-30 15:30 ` [PATCH net 08/19] net: hns: Fix to adjust buf_size of ring according to mtu Salil Mehta
2017-03-31 23:50   ` kbuild test robot
2017-03-31 23:50   ` [PATCH] net: hns: fix boolreturn.cocci warnings kbuild test robot
2017-04-03  2:44     ` David Miller
2017-04-03  2:52       ` [kbuild-all] " Fengguang Wu
2017-03-30 15:30 ` [PATCH net 09/19] net: hns: Replace netif_tx_lock to ring spin lock Salil Mehta
2017-03-30 15:30 ` [PATCH net 10/19] net: hns: Correct HNS RSS key set function Salil Mehta
2017-03-30 15:30 ` [PATCH net 11/19] net: hns: Remove the redundant adding and deleting mac function Salil Mehta
2017-03-30 15:30 ` [PATCH net 12/19] net: hns: Remove redundant mac_get_id() Salil Mehta
2017-03-30 15:31 ` [PATCH net 13/19] net: hns: Remove redundant mac table operations Salil Mehta
2017-03-30 15:31 ` [PATCH net 14/19] net: hns: Clean redundant code from hns_mdio.c file Salil Mehta
2017-03-30 15:31 ` [PATCH net 15/19] net: hns: Optimise the code in hns_mdio_wait_ready() Salil Mehta
2017-03-30 15:31 ` [PATCH net 16/19] net: hns: Simplify the exception sequence in hns_ppe_init() Salil Mehta
2017-03-30 15:31 ` [PATCH net 17/19] net: hns: Adjust the SBM module buffer threshold Salil Mehta
2017-03-30 15:31 ` [PATCH net 18/19] net: hns: Avoid Hip06 chip TX packet line bug Salil Mehta
2017-03-30 15:31 ` [PATCH net 19/19] net: hns: Some checkpatch.pl script & warning fixes Salil Mehta
2017-03-30 17:08 ` [PATCH net 00/19] net: hns: Misc. HNS Bug Fixes & Code Improvements David Miller
2017-03-30 17:19   ` Salil Mehta
2017-03-30 17:22     ` David Miller
2017-03-30 17:23       ` Salil Mehta
2017-03-31  3:03 ` David Miller
2017-03-31  9:58   ` Salil Mehta

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170330153106.14344-5-salil.mehta@huawei.com \
    --to=salil.mehta@huawei.com \
    --cc=davem@davemloft.net \
    --cc=dengweiwei@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxarm@huawei.com \
    --cc=lipeng321@huawei.com \
    --cc=mehta.salil.lnk@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=yisen.zhuang@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.