[PATCH net] net: hns: Fix the device being used for dma mapping during TX

Subsystems: hisilicon network subsystem driver, networking drivers, the rest

STALE3496d REVIEWED: 1 (0M)

1 review trailer.

7 messages, 3 authors, 2017-02-10 · open the first message on its own page

[PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: Salil Mehta <hidden>
Date: 2017-02-09 09:27:28

From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
-- 
1.7.9.5

RE: [PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: YUAN Linyu <hidden>
Date: 2017-02-09 09:37:35

quoted hunk
-----Original Message-----
From: netdev-owner@vger.kernel.org [mailto:netdev-owner@vger.kernel.org]
On Behalf Of Salil Mehta
Sent: Thursday, February 09, 2017 5:24 PM
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; Kejian Yan
Subject: [PATCH net] net: hns: Fix the device being used for dma mapping during
TX

From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
struct device *dev = ring_to_dev(ring); ??????
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
--
1.7.9.5

RE: [PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: Salil Mehta <hidden>
Date: 2017-02-09 09:48:08

-----Original Message-----
From: YUAN Linyu [mailto:Linyu.Yuan@alcatel-sbell.com.cn]
Sent: Thursday, February 09, 2017 9:36 AM
To: Salil Mehta; davem@davemloft.net
Cc: Zhuangyuzeng (Yisen); mehta.salil.lnk@gmail.com;
netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Linuxarm;
Yankejian (Hackim Yim)
Subject: RE: [PATCH net] net: hns: Fix the device being used for dma
mapping during TX


quoted
-----Original Message-----
From: netdev-owner@vger.kernel.org [mailto:netdev-
owner@vger.kernel.org]
quoted
On Behalf Of Salil Mehta
Sent: Thursday, February 09, 2017 5:24 PM
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; Kejian Yan
Subject: [PATCH net] net: hns: Fix the device being used for dma
mapping during
quoted
TX

From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
struct device *dev = ring_to_dev(ring); ??????
Yes, name of the macro is slight misnomer but this gets the dsaf device.
Hope this answers your question?

Thanks
Salil
quoted
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
--
1.7.9.5

RE: [PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: Salil Mehta <hidden>
Date: 2017-02-09 10:25:13

-----Original Message-----
From: Salil Mehta
Sent: Thursday, February 09, 2017 9:48 AM
To: 'YUAN Linyu'; davem@davemloft.net
Cc: Zhuangyuzeng (Yisen); mehta.salil.lnk@gmail.com;
netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Linuxarm;
Yankejian (Hackim Yim)
Subject: RE: [PATCH net] net: hns: Fix the device being used for dma
mapping during TX
quoted
-----Original Message-----
From: YUAN Linyu [mailto:Linyu.Yuan@alcatel-sbell.com.cn]
Sent: Thursday, February 09, 2017 9:36 AM
To: Salil Mehta; davem@davemloft.net
Cc: Zhuangyuzeng (Yisen); mehta.salil.lnk@gmail.com;
netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Linuxarm;
Yankejian (Hackim Yim)
Subject: RE: [PATCH net] net: hns: Fix the device being used for dma
mapping during TX


quoted
-----Original Message-----
From: netdev-owner@vger.kernel.org [mailto:netdev-
owner@vger.kernel.org]
quoted
On Behalf Of Salil Mehta
Sent: Thursday, February 09, 2017 5:24 PM
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; Kejian Yan
Subject: [PATCH net] net: hns: Fix the device being used for dma
mapping during
quoted
TX

From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device
*ndev,
quoted
quoted
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
struct device *dev = ring_to_dev(ring); ??????
Yes, name of the macro is slight misnomer but this gets the dsaf
device.
Hope this answers your question?
I realized this lately, I think you meant below:
  	struct hnae_ring *ring = ring_data->ring;
	struct device *dev = ring_to_dev(ring);

I will correct this and float a patch. Thanks!

Best regards
Salil
Thanks
Salil
quoted
quoted
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
--
1.7.9.5

Re: [PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: "Lino Sanfilippo" <LinoSanfilippo@gmx.de>
Date: 2017-02-09 10:25:14

Hi,
quoted hunk
From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
-- 
I would say it should be the other way around: Use priv->dev for mapping and
unmapping instead of ring_to_dev().

Regards,
Lino

RE: [PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: Salil Mehta <hidden>
Date: 2017-02-09 11:31:27

-----Original Message-----
From: Lino Sanfilippo [mailto:LinoSanfilippo@gmx.de]
Sent: Thursday, February 09, 2017 10:25 AM
To: Salil Mehta
Cc: davem@davemloft.net; Salil Mehta; Zhuangyuzeng (Yisen);
mehta.salil.lnk@gmail.com; netdev@vger.kernel.org; linux-
kernel@vger.kernel.org; Linuxarm; Yankejian (Hackim Yim)
Subject: Re: [PATCH net] net: hns: Fix the device being used for dma
mapping during TX

Hi,
quoted
From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
quoted
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
--
I would say it should be the other way around: Use priv->dev for
mapping and
unmapping instead of ring_to_dev().
Yes, you got it right. Ideally, it should be per-port and for
legacy reasons we have it this way. In the current design, we have
SMMU node per-dsaf and I guess we will not land in the right
dma-ops if we use per-netdev platform-device/device right now.

Best regards
Salil
Regards,
Lino

Aw: RE: [PATCH net] net: hns: Fix the device being used for dma mapping during TX

From: "Lino Sanfilippo" <LinoSanfilippo@gmx.de>
Date: 2017-02-10 13:10:59

Gesendet: Donnerstag, 09. Februar 2017 um 12:30 Uhr
Von: "Salil Mehta" [off-list ref]
An: "Lino Sanfilippo" [off-list ref]
Cc: "davem@davemloft.net" <davem@davemloft.net>, "Zhuangyuzeng (Yisen)" <redacted>, "mehta.salil.lnk@gmail.com" <redacted>, "netdev@vger.kernel.org" <redacted>, "linux-kernel@vger.kernel.org" <redacted>, Linuxarm <redacted>, "Yankejian (Hackim Yim)" <redacted>
Betreff: RE: [PATCH net] net: hns: Fix the device being used for dma mapping during TX
quoted
-----Original Message-----
From: Lino Sanfilippo [mailto:LinoSanfilippo@gmx.de]
Sent: Thursday, February 09, 2017 10:25 AM
To: Salil Mehta
Cc: davem@davemloft.net; Salil Mehta; Zhuangyuzeng (Yisen);
mehta.salil.lnk@gmail.com; netdev@vger.kernel.org; linux-
kernel@vger.kernel.org; Linuxarm; Yankejian (Hackim Yim)
Subject: Re: [PATCH net] net: hns: Fix the device being used for dma
mapping during TX

Hi,
quoted
From: Kejian Yan <redacted>

This patch fixes the device being used to DMA map skb->data.
Erroneous device assignment causes the crash when SMMU is enabled.
This happens during TX since buffer gets DMA mapped with device
correspondign to net_device and gets unmapped using the device
related to DSAF.

Signed-off-by: Kejian Yan <redacted>
Reviewed-by: Yisen Zhuang <redacted>
Signed-off-by: Salil Mehta <redacted>
---
 drivers/net/ethernet/hisilicon/hns/hns_enet.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
quoted
index 672b646..2b52a12 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -305,7 +305,7 @@ int hns_nic_net_xmit_hw(struct net_device *ndev,
 			struct hns_nic_ring_data *ring_data)
 {
 	struct hns_nic_priv *priv = netdev_priv(ndev);
-	struct device *dev = priv->dev;
+	struct device *dev = ring_to_dev(ring_data->ring);
 	struct hnae_ring *ring = ring_data->ring;
 	struct netdev_queue *dev_queue;
 	struct skb_frag_struct *frag;
--
I would say it should be the other way around: Use priv->dev for
mapping and
unmapping instead of ring_to_dev().
Yes, you got it right. Ideally, it should be per-port and for
legacy reasons we have it this way. In the current design, we have
SMMU node per-dsaf and I guess we will not land in the right
dma-ops if we use per-netdev platform-device/device right now.
Ok, but how can it work if we set the DMA mask of the device object of 
the plaform_device (via dma_set_mask_and_coherent in the probe() function)
and do the actual mapping with a different device object? I dont know much about
 the low level dma handling but I can imagine that the mask is required to
do the mapping correctly. 

Regards,
Lino
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help