| From 21bb8ef79cd4fb9cebbd4ce0d810213536f8e4bc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 17 Sep 2018 17:36:06 +0200 |
| Subject: s390/qeth: invoke softirqs after napi_schedule() |
| |
| From: Julian Wiedmann <jwi@linux.ibm.com> |
| |
| [ Upstream commit 4d19db777a2f32c9b76f6fd517ed8960576cb43e ] |
| |
| Calling napi_schedule() from process context does not ensure that the |
| NET_RX softirq is run in a timely fashion. So trigger it manually. |
| |
| This is no big issue with current code. A call to ndo_open() is usually |
| followed by a ndo_set_rx_mode() call, and for qeth this contains a |
| spin_unlock_bh(). Except for OSN, where qeth_l2_set_rx_mode() bails out |
| early. |
| Nevertheless it's best to not depend on this behaviour, and just fix |
| the issue at its source like all other drivers do. For instance see |
| commit 83a0c6e58901 ("i40e: Invoke softirqs after napi_reschedule"). |
| |
| Fixes: a1c3ed4c9ca0 ("qeth: NAPI support for l2 and l3 discipline") |
| Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/s390/net/qeth_l2_main.c | 3 +++ |
| drivers/s390/net/qeth_l3_main.c | 3 +++ |
| 2 files changed, 6 insertions(+) |
| |
| diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c |
| index c1c35eccd5b65..95669d47c389e 100644 |
| --- a/drivers/s390/net/qeth_l2_main.c |
| +++ b/drivers/s390/net/qeth_l2_main.c |
| @@ -789,7 +789,10 @@ static int __qeth_l2_open(struct net_device *dev) |
| |
| if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { |
| napi_enable(&card->napi); |
| + local_bh_disable(); |
| napi_schedule(&card->napi); |
| + /* kick-start the NAPI softirq: */ |
| + local_bh_enable(); |
| } else |
| rc = -EIO; |
| return rc; |
| diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c |
| index 9c5e801b3f6cb..52e0ae4dc7241 100644 |
| --- a/drivers/s390/net/qeth_l3_main.c |
| +++ b/drivers/s390/net/qeth_l3_main.c |
| @@ -2414,7 +2414,10 @@ static int __qeth_l3_open(struct net_device *dev) |
| |
| if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { |
| napi_enable(&card->napi); |
| + local_bh_disable(); |
| napi_schedule(&card->napi); |
| + /* kick-start the NAPI softirq: */ |
| + local_bh_enable(); |
| } else |
| rc = -EIO; |
| return rc; |
| -- |
| 2.20.1 |
| |