* [net-next PATCH 0/2] CPSW interrupt handling cleanup and performance improvement
@ 2015-07-27 11:18 Mugunthan V N
2015-07-27 11:19 ` [net-next PATCH 1/2] drivers: net: cpsw: remove disable_irq/enable_irq as irq can be masked from cpsw itself Mugunthan V N
2015-07-27 11:19 ` [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment Mugunthan V N
0 siblings, 2 replies; 10+ messages in thread
From: Mugunthan V N @ 2015-07-27 11:18 UTC (permalink / raw)
To: netdev; +Cc: davem, Mugunthan V N
This patch series removes the irq controller disable interrupt and
adding a napi for tx event handling which improves the performance by
180Mbps on dra7-evm
[ 5] local 192.168.10.116 port 5001 connected with 192.168.10.125 port 44174
[ 5] 0.0-60.0 sec 1.46 GBytes 209 Mbits/sec
[ 4] local 192.168.10.116 port 5001 connected with 192.168.10.125 port 33954
[ 4] 0.0-60.0 sec 2.72 GBytes 390 Mbits/sec
Mugunthan V N (2):
drivers: net: cpsw: remove disable_irq/enable_irq as irq can be
masked from cpsw itself
drivers: net: cpsw: add separate napi for tx packet handling for
performance improvment
drivers/net/ethernet/ti/cpsw.c | 88 +++++++++++++++++++++++-------------------
1 file changed, 49 insertions(+), 39 deletions(-)
--
2.5.0.rc3.2.g6f9504c
^ permalink raw reply [flat|nested] 10+ messages in thread
* [net-next PATCH 1/2] drivers: net: cpsw: remove disable_irq/enable_irq as irq can be masked from cpsw itself
2015-07-27 11:18 [net-next PATCH 0/2] CPSW interrupt handling cleanup and performance improvement Mugunthan V N
@ 2015-07-27 11:19 ` Mugunthan V N
2015-07-27 11:19 ` [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment Mugunthan V N
1 sibling, 0 replies; 10+ messages in thread
From: Mugunthan V N @ 2015-07-27 11:19 UTC (permalink / raw)
To: netdev; +Cc: davem, Mugunthan V N
CPSW interrupts can be disabled by masking CPSW interrupts and
clearing interrupt by writing appropriate EOI. So removing all
disable_irq/enable_irq as discussed in [1]
[1] http://patchwork.ozlabs.org/patch/492741/
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
drivers/net/ethernet/ti/cpsw.c | 27 ++-------------------------
1 file changed, 2 insertions(+), 25 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index d155bf2..d68d759 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -389,7 +389,6 @@ struct cpsw_priv {
/* snapshot of IRQ numbers */
u32 irqs_table[4];
u32 num_irqs;
- bool irq_enabled;
struct cpts *cpts;
u32 emac_port;
};
@@ -767,12 +766,7 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id)
struct cpsw_priv *priv = dev_id;
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
-
- cpsw_intr_disable(priv);
- if (priv->irq_enabled == true) {
- disable_irq_nosync(priv->irqs_table[0]);
- priv->irq_enabled = false;
- }
+ writel(0, &priv->wr_regs->rx_en);
if (netif_running(priv->ndev)) {
napi_schedule(&priv->napi);
@@ -797,15 +791,8 @@ static int cpsw_poll(struct napi_struct *napi, int budget)
num_rx = cpdma_chan_process(priv->rxch, budget);
if (num_rx < budget) {
- struct cpsw_priv *prim_cpsw;
-
napi_complete(napi);
- cpsw_intr_enable(priv);
- prim_cpsw = cpsw_get_slave_priv(priv, 0);
- if (prim_cpsw->irq_enabled == false) {
- prim_cpsw->irq_enabled = true;
- enable_irq(priv->irqs_table[0]);
- }
+ writel(0xff, &priv->wr_regs->rx_en);
}
if (num_rx)
@@ -1230,7 +1217,6 @@ static void cpsw_slave_stop(struct cpsw_slave *slave, struct cpsw_priv *priv)
static int cpsw_ndo_open(struct net_device *ndev)
{
struct cpsw_priv *priv = netdev_priv(ndev);
- struct cpsw_priv *prim_cpsw;
int i, ret;
u32 reg;
@@ -1315,14 +1301,6 @@ static int cpsw_ndo_open(struct net_device *ndev)
cpdma_ctlr_start(priv->dma);
cpsw_intr_enable(priv);
- prim_cpsw = cpsw_get_slave_priv(priv, 0);
- if (prim_cpsw->irq_enabled == false) {
- if ((priv == prim_cpsw) || !netif_running(prim_cpsw->ndev)) {
- prim_cpsw->irq_enabled = true;
- enable_irq(prim_cpsw->irqs_table[0]);
- }
- }
-
if (priv->data.dual_emac)
priv->slaves[priv->emac_port].open_stat = true;
return 0;
@@ -2169,7 +2147,6 @@ static int cpsw_probe(struct platform_device *pdev)
priv->msg_enable = netif_msg_init(debug_level, CPSW_DEBUG);
priv->rx_packet_max = max(rx_packet_max, 128);
priv->cpts = devm_kzalloc(&pdev->dev, sizeof(struct cpts), GFP_KERNEL);
- priv->irq_enabled = true;
if (!priv->cpts) {
dev_err(&pdev->dev, "error allocating cpts\n");
ret = -ENOMEM;
--
2.5.0.rc3.2.g6f9504c
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-27 11:18 [net-next PATCH 0/2] CPSW interrupt handling cleanup and performance improvement Mugunthan V N
2015-07-27 11:19 ` [net-next PATCH 1/2] drivers: net: cpsw: remove disable_irq/enable_irq as irq can be masked from cpsw itself Mugunthan V N
@ 2015-07-27 11:19 ` Mugunthan V N
2015-07-27 21:22 ` Francois Romieu
1 sibling, 1 reply; 10+ messages in thread
From: Mugunthan V N @ 2015-07-27 11:19 UTC (permalink / raw)
To: netdev; +Cc: davem, Mugunthan V N
Instead of processing tx events in ISR itself, moving the tx
event processing to a separate napi improves tx performance by
180 Mbps with omap2plus_defconfig. Also cleaning up rx napis by
renaming to napi_rx for better understanding the code.
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
drivers/net/ethernet/ti/cpsw.c | 61 ++++++++++++++++++++++++++++++++----------
1 file changed, 47 insertions(+), 14 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index d68d759..4f98537 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -365,7 +365,8 @@ struct cpsw_priv {
spinlock_t lock;
struct platform_device *pdev;
struct net_device *ndev;
- struct napi_struct napi;
+ struct napi_struct napi_rx;
+ struct napi_struct napi_tx;
struct device *dev;
struct cpsw_platform_data data;
struct cpsw_ss_regs __iomem *regs;
@@ -752,13 +753,22 @@ static irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id)
struct cpsw_priv *priv = dev_id;
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
- cpdma_chan_process(priv->txch, 128);
+ writel(0, &priv->wr_regs->tx_en);
+
+ if (netif_running(priv->ndev)) {
+ napi_schedule(&priv->napi_tx);
+ return IRQ_HANDLED;
+ }
priv = cpsw_get_slave_priv(priv, 1);
- if (priv)
- cpdma_chan_process(priv->txch, 128);
+ if (!priv)
+ return IRQ_NONE;
- return IRQ_HANDLED;
+ if (netif_running(priv->ndev)) {
+ napi_schedule(&priv->napi_tx);
+ return IRQ_HANDLED;
+ }
+ return IRQ_NONE;
}
static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id)
@@ -769,7 +779,7 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id)
writel(0, &priv->wr_regs->rx_en);
if (netif_running(priv->ndev)) {
- napi_schedule(&priv->napi);
+ napi_schedule(&priv->napi_rx);
return IRQ_HANDLED;
}
@@ -778,20 +788,37 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id)
return IRQ_NONE;
if (netif_running(priv->ndev)) {
- napi_schedule(&priv->napi);
+ napi_schedule(&priv->napi_rx);
return IRQ_HANDLED;
}
return IRQ_NONE;
}
-static int cpsw_poll(struct napi_struct *napi, int budget)
+static int cpsw_tx_poll(struct napi_struct *napi_tx, int budget)
+{
+ struct cpsw_priv *priv = napi_to_priv(napi_tx);
+ int num_tx;
+
+ num_tx = cpdma_chan_process(priv->txch, budget);
+ if (num_tx < budget) {
+ napi_complete(napi_tx);
+ writel(0xff, &priv->wr_regs->tx_en);
+ }
+
+ if (num_tx)
+ cpsw_dbg(priv, intr, "poll %d tx pkts\n", num_tx);
+
+ return num_tx;
+}
+
+static int cpsw_rx_poll(struct napi_struct *napi_rx, int budget)
{
- struct cpsw_priv *priv = napi_to_priv(napi);
+ struct cpsw_priv *priv = napi_to_priv(napi_rx);
int num_rx;
num_rx = cpdma_chan_process(priv->rxch, budget);
if (num_rx < budget) {
- napi_complete(napi);
+ napi_complete(napi_rx);
writel(0xff, &priv->wr_regs->rx_en);
}
@@ -1297,7 +1324,8 @@ static int cpsw_ndo_open(struct net_device *ndev)
cpsw_set_coalesce(ndev, &coal);
}
- napi_enable(&priv->napi);
+ napi_enable(&priv->napi_rx);
+ napi_enable(&priv->napi_tx);
cpdma_ctlr_start(priv->dma);
cpsw_intr_enable(priv);
@@ -1319,7 +1347,8 @@ static int cpsw_ndo_stop(struct net_device *ndev)
cpsw_info(priv, ifdown, "shutting down cpsw device\n");
netif_stop_queue(priv->ndev);
- napi_disable(&priv->napi);
+ napi_disable(&priv->napi_rx);
+ napi_disable(&priv->napi_tx);
netif_carrier_off(priv->ndev);
if (cpsw_common_res_usage_state(priv) <= 1) {
@@ -2105,7 +2134,10 @@ static int cpsw_probe_dual_emac(struct platform_device *pdev,
ndev->netdev_ops = &cpsw_netdev_ops;
ndev->ethtool_ops = &cpsw_ethtool_ops;
- netif_napi_add(ndev, &priv_sl2->napi, cpsw_poll, CPSW_POLL_WEIGHT);
+ netif_napi_add(ndev, &priv_sl2->napi_rx, cpsw_rx_poll,
+ CPSW_POLL_WEIGHT);
+ netif_napi_add(ndev, &priv_sl2->napi_tx, cpsw_tx_poll,
+ CPSW_POLL_WEIGHT);
/* register the network device */
SET_NETDEV_DEV(ndev, &pdev->dev);
@@ -2357,7 +2389,8 @@ static int cpsw_probe(struct platform_device *pdev)
ndev->netdev_ops = &cpsw_netdev_ops;
ndev->ethtool_ops = &cpsw_ethtool_ops;
- netif_napi_add(ndev, &priv->napi, cpsw_poll, CPSW_POLL_WEIGHT);
+ netif_napi_add(ndev, &priv->napi_rx, cpsw_rx_poll, CPSW_POLL_WEIGHT);
+ netif_napi_add(ndev, &priv->napi_tx, cpsw_tx_poll, CPSW_POLL_WEIGHT);
/* register the network device */
SET_NETDEV_DEV(ndev, &pdev->dev);
--
2.5.0.rc3.2.g6f9504c
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-27 11:19 ` [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment Mugunthan V N
@ 2015-07-27 21:22 ` Francois Romieu
2015-07-28 6:02 ` Mugunthan V N
2015-07-28 6:18 ` Mugunthan V N
0 siblings, 2 replies; 10+ messages in thread
From: Francois Romieu @ 2015-07-27 21:22 UTC (permalink / raw)
To: Mugunthan V N; +Cc: netdev, davem
Mugunthan V N <mugunthanvnm@ti.com> :
[...]
> diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
> index d68d759..4f98537 100644
> --- a/drivers/net/ethernet/ti/cpsw.c
> +++ b/drivers/net/ethernet/ti/cpsw.c
> @@ -752,13 +753,22 @@ static irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id)
> struct cpsw_priv *priv = dev_id;
>
> cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
> - cpdma_chan_process(priv->txch, 128);
> + writel(0, &priv->wr_regs->tx_en);
> +
> + if (netif_running(priv->ndev)) {
> + napi_schedule(&priv->napi_tx);
> + return IRQ_HANDLED;
> + }
cpsw_ndo_stop calls napi_disable: you can remove netif_running.
--
Ueimor
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-27 21:22 ` Francois Romieu
@ 2015-07-28 6:02 ` Mugunthan V N
2015-07-28 6:18 ` Mugunthan V N
1 sibling, 0 replies; 10+ messages in thread
From: Mugunthan V N @ 2015-07-28 6:02 UTC (permalink / raw)
To: Francois Romieu; +Cc: netdev, davem
On Tuesday 28 July 2015 02:52 AM, Francois Romieu wrote:
> Mugunthan V N <mugunthanvnm@ti.com> :
> [...]
>> diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
>> index d68d759..4f98537 100644
>> --- a/drivers/net/ethernet/ti/cpsw.c
>> +++ b/drivers/net/ethernet/ti/cpsw.c
>> @@ -752,13 +753,22 @@ static irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id)
>> struct cpsw_priv *priv = dev_id;
>>
>> cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
>> - cpdma_chan_process(priv->txch, 128);
>> + writel(0, &priv->wr_regs->tx_en);
>> +
>> + if (netif_running(priv->ndev)) {
>> + napi_schedule(&priv->napi_tx);
>> + return IRQ_HANDLED;
>> + }
>
>
> cpsw_ndo_stop calls napi_disable: you can remove netif_running.
>
Hmmmm, Will fix in v2.
Regards
Mugunthan V N
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-27 21:22 ` Francois Romieu
2015-07-28 6:02 ` Mugunthan V N
@ 2015-07-28 6:18 ` Mugunthan V N
2015-07-28 22:30 ` Francois Romieu
1 sibling, 1 reply; 10+ messages in thread
From: Mugunthan V N @ 2015-07-28 6:18 UTC (permalink / raw)
To: Francois Romieu; +Cc: netdev, davem
On Tuesday 28 July 2015 02:52 AM, Francois Romieu wrote:
> Mugunthan V N <mugunthanvnm@ti.com> :
> [...]
>> diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
>> index d68d759..4f98537 100644
>> --- a/drivers/net/ethernet/ti/cpsw.c
>> +++ b/drivers/net/ethernet/ti/cpsw.c
>> @@ -752,13 +753,22 @@ static irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id)
>> struct cpsw_priv *priv = dev_id;
>>
>> cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
>> - cpdma_chan_process(priv->txch, 128);
>> + writel(0, &priv->wr_regs->tx_en);
>> +
>> + if (netif_running(priv->ndev)) {
>> + napi_schedule(&priv->napi_tx);
>> + return IRQ_HANDLED;
>> + }
>
>
> cpsw_ndo_stop calls napi_disable: you can remove netif_running.
>
This netif_running check is to find which interface is up as the
interrupt is shared by both the interfaces. When first interface is down
and second interface is active then napi_schedule for first interface
will fail and second interface napi needs to be scheduled.
So I don't think netif_running needs to be removed.
Regards
Mugunthan V N
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-28 6:18 ` Mugunthan V N
@ 2015-07-28 22:30 ` Francois Romieu
2015-07-29 5:18 ` Mugunthan V N
0 siblings, 1 reply; 10+ messages in thread
From: Francois Romieu @ 2015-07-28 22:30 UTC (permalink / raw)
To: Mugunthan V N; +Cc: netdev, davem
Mugunthan V N <mugunthanvnm@ti.com> :
> On Tuesday 28 July 2015 02:52 AM, Francois Romieu wrote:
> > Mugunthan V N <mugunthanvnm@ti.com> :
[...]
> >> @@ -752,13 +753,22 @@ static irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id)
> >> struct cpsw_priv *priv = dev_id;
> >>
> >> cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
> >> - cpdma_chan_process(priv->txch, 128);
> >> + writel(0, &priv->wr_regs->tx_en);
> >> +
> >> + if (netif_running(priv->ndev)) {
> >> + napi_schedule(&priv->napi_tx);
> >> + return IRQ_HANDLED;
> >> + }
> >
> >
> > cpsw_ndo_stop calls napi_disable: you can remove netif_running.
> >
>
> This netif_running check is to find which interface is up as the
> interrupt is shared by both the interfaces. When first interface is down
> and second interface is active then napi_schedule for first interface
> will fail and second interface napi needs to be scheduled.
>
> So I don't think netif_running needs to be removed.
Each interface has its own napi tx (resp. rx) context: I would had expected
two unconditional napi_schedule per tx (resp. rx) shared irq, not one.
I'll read it again after some sleep.
--
Ueimor
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-28 22:30 ` Francois Romieu
@ 2015-07-29 5:18 ` Mugunthan V N
2015-07-29 22:57 ` Francois Romieu
0 siblings, 1 reply; 10+ messages in thread
From: Mugunthan V N @ 2015-07-29 5:18 UTC (permalink / raw)
To: Francois Romieu; +Cc: netdev, davem
On Wednesday 29 July 2015 04:00 AM, Francois Romieu wrote:
> Mugunthan V N <mugunthanvnm@ti.com> :
>> On Tuesday 28 July 2015 02:52 AM, Francois Romieu wrote:
>>> Mugunthan V N <mugunthanvnm@ti.com> :
> [...]
>>>> @@ -752,13 +753,22 @@ static irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id)
>>>> struct cpsw_priv *priv = dev_id;
>>>>
>>>> cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
>>>> - cpdma_chan_process(priv->txch, 128);
>>>> + writel(0, &priv->wr_regs->tx_en);
>>>> +
>>>> + if (netif_running(priv->ndev)) {
>>>> + napi_schedule(&priv->napi_tx);
>>>> + return IRQ_HANDLED;
>>>> + }
>>>
>>>
>>> cpsw_ndo_stop calls napi_disable: you can remove netif_running.
>>>
>>
>> This netif_running check is to find which interface is up as the
>> interrupt is shared by both the interfaces. When first interface is down
>> and second interface is active then napi_schedule for first interface
>> will fail and second interface napi needs to be scheduled.
>>
>> So I don't think netif_running needs to be removed.
>
> Each interface has its own napi tx (resp. rx) context: I would had expected
> two unconditional napi_schedule per tx (resp. rx) shared irq, not one.
>
> I'll read it again after some sleep.
>
For each interrupt only one napi will be scheduled, when the first
interface is down then only second interface napi is scheduled in both
tx and rx irqs.
Regards
Mugunthan V N
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-29 5:18 ` Mugunthan V N
@ 2015-07-29 22:57 ` Francois Romieu
2015-07-30 6:12 ` Mugunthan V N
0 siblings, 1 reply; 10+ messages in thread
From: Francois Romieu @ 2015-07-29 22:57 UTC (permalink / raw)
To: Mugunthan V N; +Cc: netdev, davem
Mugunthan V N <mugunthanvnm@ti.com> :
> On Wednesday 29 July 2015 04:00 AM, Francois Romieu wrote:
> > Mugunthan V N <mugunthanvnm@ti.com> :
> >> On Tuesday 28 July 2015 02:52 AM, Francois Romieu wrote:
[...]
> >>> cpsw_ndo_stop calls napi_disable: you can remove netif_running.
> >>>
> >>
> >> This netif_running check is to find which interface is up as the
> >> interrupt is shared by both the interfaces. When first interface is down
> >> and second interface is active then napi_schedule for first interface
> >> will fail and second interface napi needs to be scheduled.
> >>
> >> So I don't think netif_running needs to be removed.
> >
> > Each interface has its own napi tx (resp. rx) context: I would had expected
> > two unconditional napi_schedule per tx (resp. rx) shared irq, not one.
> >
> > I'll read it again after some sleep.
> >
>
> For each interrupt only one napi will be scheduled, when the first
> interface is down then only second interface napi is scheduled in both
> tx and rx irqs.
Ok, I've had some hints from the "Assumptions" section at
http://processors.wiki.ti.com/index.php/AM335x_CPSW_%28Ethernet%29_Driver%27s_Guide#Dual_Standalone_EMAC_mode
Why does the driver create 2 rx napi contexts ? They don't run at the
same time and the port demux is done in cpsw_dual_emac_src_port_detect.
The driver would work the same with a single rx (resp. tx) napi context
for both interfaces.
--
Ueimor
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment
2015-07-29 22:57 ` Francois Romieu
@ 2015-07-30 6:12 ` Mugunthan V N
0 siblings, 0 replies; 10+ messages in thread
From: Mugunthan V N @ 2015-07-30 6:12 UTC (permalink / raw)
To: Francois Romieu; +Cc: netdev, davem
On Thursday 30 July 2015 04:27 AM, Francois Romieu wrote:
> Mugunthan V N <mugunthanvnm@ti.com> :
>> On Wednesday 29 July 2015 04:00 AM, Francois Romieu wrote:
>>> Mugunthan V N <mugunthanvnm@ti.com> :
>>>> On Tuesday 28 July 2015 02:52 AM, Francois Romieu wrote:
> [...]
>>>>> cpsw_ndo_stop calls napi_disable: you can remove netif_running.
>>>>>
>>>>
>>>> This netif_running check is to find which interface is up as the
>>>> interrupt is shared by both the interfaces. When first interface is down
>>>> and second interface is active then napi_schedule for first interface
>>>> will fail and second interface napi needs to be scheduled.
>>>>
>>>> So I don't think netif_running needs to be removed.
>>>
>>> Each interface has its own napi tx (resp. rx) context: I would had expected
>>> two unconditional napi_schedule per tx (resp. rx) shared irq, not one.
>>>
>>> I'll read it again after some sleep.
>>>
>>
>> For each interrupt only one napi will be scheduled, when the first
>> interface is down then only second interface napi is scheduled in both
>> tx and rx irqs.
>
> Ok, I've had some hints from the "Assumptions" section at
> http://processors.wiki.ti.com/index.php/AM335x_CPSW_%28Ethernet%29_Driver%27s_Guide#Dual_Standalone_EMAC_mode
>
> Why does the driver create 2 rx napi contexts ? They don't run at the
> same time and the port demux is done in cpsw_dual_emac_src_port_detect.
> The driver would work the same with a single rx (resp. tx) napi context
> for both interfaces.
>
The wiki you had pointed out is old design done on v3.2 and doesn't have
device tree support also. In mainline Dual EMAC implementation has
changed a lot.
I can think of a way with one napi implementation for each rx and tx,
will submit a separate patch for it.
Regards
Mugunthan V N
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-07-30 6:12 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-27 11:18 [net-next PATCH 0/2] CPSW interrupt handling cleanup and performance improvement Mugunthan V N
2015-07-27 11:19 ` [net-next PATCH 1/2] drivers: net: cpsw: remove disable_irq/enable_irq as irq can be masked from cpsw itself Mugunthan V N
2015-07-27 11:19 ` [net-next PATCH 2/2] drivers: net: cpsw: add separate napi for tx packet handling for performance improvment Mugunthan V N
2015-07-27 21:22 ` Francois Romieu
2015-07-28 6:02 ` Mugunthan V N
2015-07-28 6:18 ` Mugunthan V N
2015-07-28 22:30 ` Francois Romieu
2015-07-29 5:18 ` Mugunthan V N
2015-07-29 22:57 ` Francois Romieu
2015-07-30 6:12 ` Mugunthan V N
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).