2016-03-10 13:03:19

by Yankejian (Hackim Yim)

[permalink] [raw]
Subject: [PATCH v2 net-next 0/2] net: hns: get and set RSS indirection table by using ethtool

When we use ethtool to retrieves or configure the receive flow hash
indirection table, ethtool needs to call .get_rxnfc to get the ring number
so this patchset implements the .get_rxnfc and fixes the bug that we can
not get the tatal table each time.

---
change log:
PATCH v2:
- This patch fixes the comments provided by Andy Shevchenko <Andy Shevchenko>

PATCH v1:
- first submit

Kejian Yan (2):
net: hns: fix return value of the function about rss
net: hns: fixes a bug of RSS

drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 8 ++++---
drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c | 2 +-
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c | 26 +++++++++++++++++------
3 files changed, 26 insertions(+), 10 deletions(-)

--
1.9.1


2016-03-10 13:03:13

by Yankejian (Hackim Yim)

[permalink] [raw]
Subject: [PATCH v2 net-next 1/2] net: hns: fix return value of the function about rss

Both .get_rxfh and .get_rxfh are always return 0, it should return result
from hardware when getting or setting rss. And the rss function should
return the correct data type.

Signed-off-by: Kejian Yan <[email protected]>
---
change log:
PATCH v2:
- This patch fixes the comments provided by Andy Shevchenko <Andy Shevchenko>

PATCH v1:
- first submit

Link: https://lkml.org/lkml/2016/3/9/978
---
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 2 +-
drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c | 2 +-
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c | 12 ++++--------
3 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index d4f92ed..d07db1f 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -799,7 +799,7 @@ static int hns_ae_set_rss(struct hnae_handle *handle, const u32 *indir,

/* set the RSS Hash Key if specififed by the user */
if (key)
- hns_ppe_set_rss_key(ppe_cb, (int *)key);
+ hns_ppe_set_rss_key(ppe_cb, (u32 *)key);

/* update the shadow RSS table with user specified qids */
memcpy(ppe_cb->rss_indir_table, indir, HNS_PPEV2_RSS_IND_TBL_SIZE);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c
index f302ef9..811ef35 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c
@@ -27,7 +27,7 @@ void hns_ppe_set_tso_enable(struct hns_ppe_cb *ppe_cb, u32 value)
void hns_ppe_set_rss_key(struct hns_ppe_cb *ppe_cb,
const u32 rss_key[HNS_PPEV2_RSS_KEY_NUM])
{
- int key_item = 0;
+ u32 key_item = 0;

for (key_item = 0; key_item < HNS_PPEV2_RSS_KEY_NUM; key_item++)
dsaf_write_dev(ppe_cb, PPEV2_RSS_KEY_REG + key_item * 0x4,
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index 3c4a3bc..3b914ac 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -1178,7 +1178,7 @@ hns_get_rss_key_size(struct net_device *netdev)
if (AE_IS_VER1(priv->enet_ver)) {
netdev_err(netdev,
"RSS feature is not supported on this hardware\n");
- return -EOPNOTSUPP;
+ return (u32)-EOPNOTSUPP;
}

ops = priv->ae_handle->dev->ops;
@@ -1197,7 +1197,7 @@ hns_get_rss_indir_size(struct net_device *netdev)
if (AE_IS_VER1(priv->enet_ver)) {
netdev_err(netdev,
"RSS feature is not supported on this hardware\n");
- return -EOPNOTSUPP;
+ return (u32)-EOPNOTSUPP;
}

ops = priv->ae_handle->dev->ops;
@@ -1224,9 +1224,7 @@ hns_get_rss(struct net_device *netdev, u32 *indir, u8 *key, u8 *hfunc)
if (!indir)
return 0;

- ret = ops->get_rss(priv->ae_handle, indir, key, hfunc);
-
- return 0;
+ return ops->get_rss(priv->ae_handle, indir, key, hfunc);
}

static int
@@ -1252,9 +1250,7 @@ hns_set_rss(struct net_device *netdev, const u32 *indir, const u8 *key,
if (!indir)
return 0;

- ret = ops->set_rss(priv->ae_handle, indir, key, hfunc);
-
- return 0;
+ return ops->set_rss(priv->ae_handle, indir, key, hfunc);
}

static struct ethtool_ops hns_ethtool_ops = {
--
1.9.1

2016-03-10 13:03:39

by Yankejian (Hackim Yim)

[permalink] [raw]
Subject: [PATCH v2 net-next 2/2] net: hns: fixes a bug of RSS

If trying to get receive flow hash indirection table by ethtool, it needs
to call .get_rxnfc to get ring number first. So this patch implements the
.get_rxnfc of ethtool. And the data type of rss_indir_table is u32, it has
to be multiply by the width of data type when using memcpy.

Signed-off-by: Kejian Yan <[email protected]>
---
change log:
PATCH v2:
- This patch fixes the comments provided by Andy Shevchenko <Andy Shevchenko>

PATCH v1:
- first submit

Link: https://lkml.org/lkml/2016/3/9/981
---
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c | 6 ++++--
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c | 18 ++++++++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index d07db1f..7b06e9b 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -787,7 +787,8 @@ static int hns_ae_get_rss(struct hnae_handle *handle, u32 *indir, u8 *key,
memcpy(key, ppe_cb->rss_key, HNS_PPEV2_RSS_KEY_SIZE);

/* update the current hash->queue mappings from the shadow RSS table */
- memcpy(indir, ppe_cb->rss_indir_table, HNS_PPEV2_RSS_IND_TBL_SIZE);
+ memcpy(indir, ppe_cb->rss_indir_table,
+ HNS_PPEV2_RSS_IND_TBL_SIZE * sizeof(*indir));

return 0;
}
@@ -802,7 +803,8 @@ static int hns_ae_set_rss(struct hnae_handle *handle, const u32 *indir,
hns_ppe_set_rss_key(ppe_cb, (u32 *)key);

/* update the shadow RSS table with user specified qids */
- memcpy(ppe_cb->rss_indir_table, indir, HNS_PPEV2_RSS_IND_TBL_SIZE);
+ memcpy(ppe_cb->rss_indir_table, indir,
+ HNS_PPEV2_RSS_IND_TBL_SIZE * sizeof(*indir));

/* now update the hardware */
hns_ppe_set_indir_table(ppe_cb, ppe_cb->rss_indir_table);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index 3b914ac..24b2b5f 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -1253,6 +1253,23 @@ hns_set_rss(struct net_device *netdev, const u32 *indir, const u8 *key,
return ops->set_rss(priv->ae_handle, indir, key, hfunc);
}

+static int hns_get_rxnfc(struct net_device *netdev,
+ struct ethtool_rxnfc *cmd,
+ u32 *rule_locs)
+{
+ struct hns_nic_priv *priv = netdev_priv(netdev);
+
+ switch (cmd->cmd) {
+ case ETHTOOL_GRXRINGS:
+ cmd->data = priv->ae_handle->q_num;
+ break;
+ default:
+ return -ERRNO;
+ }
+
+ return 0;
+}
+
static struct ethtool_ops hns_ethtool_ops = {
.get_drvinfo = hns_nic_get_drvinfo,
.get_link = hns_nic_get_link,
@@ -1276,6 +1293,7 @@ static struct ethtool_ops hns_ethtool_ops = {
.get_rxfh_indir_size = hns_get_rss_indir_size,
.get_rxfh = hns_get_rss,
.set_rxfh = hns_set_rss,
+ .get_rxnfc = hns_get_rxnfc,
};

void hns_ethtool_set_ops(struct net_device *ndev)
--
1.9.1

2016-03-10 13:28:10

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v2 net-next 1/2] net: hns: fix return value of the function about rss

Hi Kejian,

[auto build test WARNING on net-next/master]

url: https://github.com/0day-ci/linux/commits/Kejian-Yan/net-hns-get-and-set-RSS-indirection-table-by-using-ethtool/20160310-210648
config: x86_64-allyesconfig (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

All warnings (new ones prefixed by >>):

drivers/net/ethernet/hisilicon/hns/hns_ethtool.c: In function 'hns_get_rss':
>> drivers/net/ethernet/hisilicon/hns/hns_ethtool.c:1214:6: warning: unused variable 'ret' [-Wunused-variable]
int ret;
^
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c: In function 'hns_set_rss':
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c:1236:6: warning: unused variable 'ret' [-Wunused-variable]
int ret;
^

vim +/ret +1214 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c

6bc0ce7d Salil 2015-12-03 1198 netdev_err(netdev,
6bc0ce7d Salil 2015-12-03 1199 "RSS feature is not supported on this hardware\n");
73f4f566 Kejian Yan 2016-03-10 1200 return (u32)-EOPNOTSUPP;
6bc0ce7d Salil 2015-12-03 1201 }
6bc0ce7d Salil 2015-12-03 1202
6bc0ce7d Salil 2015-12-03 1203 ops = priv->ae_handle->dev->ops;
6bc0ce7d Salil 2015-12-03 1204 ret = ops->get_rss_indir_size(priv->ae_handle);
6bc0ce7d Salil 2015-12-03 1205
6bc0ce7d Salil 2015-12-03 1206 return ret;
6bc0ce7d Salil 2015-12-03 1207 }
6bc0ce7d Salil 2015-12-03 1208
6bc0ce7d Salil 2015-12-03 1209 static int
6bc0ce7d Salil 2015-12-03 1210 hns_get_rss(struct net_device *netdev, u32 *indir, u8 *key, u8 *hfunc)
6bc0ce7d Salil 2015-12-03 1211 {
6bc0ce7d Salil 2015-12-03 1212 struct hns_nic_priv *priv = netdev_priv(netdev);
6bc0ce7d Salil 2015-12-03 1213 struct hnae_ae_ops *ops;
6bc0ce7d Salil 2015-12-03 @1214 int ret;
6bc0ce7d Salil 2015-12-03 1215
6bc0ce7d Salil 2015-12-03 1216 if (AE_IS_VER1(priv->enet_ver)) {
6bc0ce7d Salil 2015-12-03 1217 netdev_err(netdev,
6bc0ce7d Salil 2015-12-03 1218 "RSS feature is not supported on this hardware\n");
6bc0ce7d Salil 2015-12-03 1219 return -EOPNOTSUPP;
6bc0ce7d Salil 2015-12-03 1220 }
6bc0ce7d Salil 2015-12-03 1221
6bc0ce7d Salil 2015-12-03 1222 ops = priv->ae_handle->dev->ops;

:::::: The code at line 1214 was first introduced by commit
:::::: 6bc0ce7d9adabf332afc102f7f97bf121b990ece net:hns: Add Hip06 "RSS(Receive Side Scaling)" support to HNS Driver

:::::: TO: Salil <[email protected]>
:::::: CC: David S. Miller <[email protected]>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (2.75 kB)
.config.gz (51.25 kB)
Download all attachments

2016-03-10 13:29:25

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v2 net-next 2/2] net: hns: fixes a bug of RSS

Hi Kejian,

[auto build test ERROR on net-next/master]

url: https://github.com/0day-ci/linux/commits/Kejian-Yan/net-hns-get-and-set-RSS-indirection-table-by-using-ethtool/20160310-210648
config: xtensa-allyesconfig (attached as .config)
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=xtensa

All errors (new ones prefixed by >>):

drivers/net/ethernet/hisilicon/hns/hns_ethtool.c: In function 'hns_get_rss':
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c:1214:6: warning: unused variable 'ret' [-Wunused-variable]
int ret;
^
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c: In function 'hns_set_rss':
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c:1236:6: warning: unused variable 'ret' [-Wunused-variable]
int ret;
^
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c: In function 'hns_get_rxnfc':
>> drivers/net/ethernet/hisilicon/hns/hns_ethtool.c:1267:11: error: 'ERRNO' undeclared (first use in this function)
return -ERRNO;
^
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c:1267:11: note: each undeclared identifier is reported only once for each function it appears in

vim +/ERRNO +1267 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c

1208
1209 static int
1210 hns_get_rss(struct net_device *netdev, u32 *indir, u8 *key, u8 *hfunc)
1211 {
1212 struct hns_nic_priv *priv = netdev_priv(netdev);
1213 struct hnae_ae_ops *ops;
> 1214 int ret;
1215
1216 if (AE_IS_VER1(priv->enet_ver)) {
1217 netdev_err(netdev,
1218 "RSS feature is not supported on this hardware\n");
1219 return -EOPNOTSUPP;
1220 }
1221
1222 ops = priv->ae_handle->dev->ops;
1223
1224 if (!indir)
1225 return 0;
1226
1227 return ops->get_rss(priv->ae_handle, indir, key, hfunc);
1228 }
1229
1230 static int
1231 hns_set_rss(struct net_device *netdev, const u32 *indir, const u8 *key,
1232 const u8 hfunc)
1233 {
1234 struct hns_nic_priv *priv = netdev_priv(netdev);
1235 struct hnae_ae_ops *ops;
1236 int ret;
1237
1238 if (AE_IS_VER1(priv->enet_ver)) {
1239 netdev_err(netdev,
1240 "RSS feature is not supported on this hardware\n");
1241 return -EOPNOTSUPP;
1242 }
1243
1244 ops = priv->ae_handle->dev->ops;
1245
1246 /* currently hfunc can only be Toeplitz hash */
1247 if (key ||
1248 (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP))
1249 return -EOPNOTSUPP;
1250 if (!indir)
1251 return 0;
1252
1253 return ops->set_rss(priv->ae_handle, indir, key, hfunc);
1254 }
1255
1256 static int hns_get_rxnfc(struct net_device *netdev,
1257 struct ethtool_rxnfc *cmd,
1258 u32 *rule_locs)
1259 {
1260 struct hns_nic_priv *priv = netdev_priv(netdev);
1261
1262 switch (cmd->cmd) {
1263 case ETHTOOL_GRXRINGS:
1264 cmd->data = priv->ae_handle->q_num;
1265 break;
1266 default:
> 1267 return -ERRNO;
1268 }
1269
1270 return 0;

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (3.27 kB)
.config.gz (43.09 kB)
Download all attachments