[PATCH 3.18 34/93] s390/qeth: lock read device while queueing next buffer

2018-04-06 Thread Greg Kroah-Hartman
3.18-stable review patch.  If anyone has any objections, please let me know.

--

From: Julian Wiedmann 


[ Upstream commit 17bf8c9b3d499d5168537c98b61eb7a1fcbca6c2 ]

For calling ccw_device_start(), issue_next_read() needs to hold the
device's ccwlock.
This is satisfied for the IRQ handler path (where qeth_irq() gets called
under the ccwlock), but we need explicit locking for the initial call by
the MPC initialization.

Signed-off-by: Julian Wiedmann 
Signed-off-by: David S. Miller 
Signed-off-by: Greg Kroah-Hartman 
---
 drivers/s390/net/qeth_core_main.c |   16 +---
 1 file changed, 13 insertions(+), 3 deletions(-)

--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -517,8 +517,7 @@ static inline int qeth_is_cq(struct qeth
queue == card->qdio.no_in_queues - 1;
 }
 
-
-static int qeth_issue_next_read(struct qeth_card *card)
+static int __qeth_issue_next_read(struct qeth_card *card)
 {
int rc;
struct qeth_cmd_buffer *iob;
@@ -549,6 +548,17 @@ static int qeth_issue_next_read(struct q
return rc;
 }
 
+static int qeth_issue_next_read(struct qeth_card *card)
+{
+   int ret;
+
+   spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card)));
+   ret = __qeth_issue_next_read(card);
+   spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card)));
+
+   return ret;
+}
+
 static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
 {
struct qeth_reply *reply;
@@ -1166,7 +1176,7 @@ static void qeth_irq(struct ccw_device *
return;
if (channel == >read &&
channel->state == CH_STATE_UP)
-   qeth_issue_next_read(card);
+   __qeth_issue_next_read(card);
 
iob = channel->iob;
index = channel->buf_no;




[PATCH 3.18 34/93] s390/qeth: lock read device while queueing next buffer

2018-04-06 Thread Greg Kroah-Hartman
3.18-stable review patch.  If anyone has any objections, please let me know.

--

From: Julian Wiedmann 


[ Upstream commit 17bf8c9b3d499d5168537c98b61eb7a1fcbca6c2 ]

For calling ccw_device_start(), issue_next_read() needs to hold the
device's ccwlock.
This is satisfied for the IRQ handler path (where qeth_irq() gets called
under the ccwlock), but we need explicit locking for the initial call by
the MPC initialization.

Signed-off-by: Julian Wiedmann 
Signed-off-by: David S. Miller 
Signed-off-by: Greg Kroah-Hartman 
---
 drivers/s390/net/qeth_core_main.c |   16 +---
 1 file changed, 13 insertions(+), 3 deletions(-)

--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -517,8 +517,7 @@ static inline int qeth_is_cq(struct qeth
queue == card->qdio.no_in_queues - 1;
 }
 
-
-static int qeth_issue_next_read(struct qeth_card *card)
+static int __qeth_issue_next_read(struct qeth_card *card)
 {
int rc;
struct qeth_cmd_buffer *iob;
@@ -549,6 +548,17 @@ static int qeth_issue_next_read(struct q
return rc;
 }
 
+static int qeth_issue_next_read(struct qeth_card *card)
+{
+   int ret;
+
+   spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card)));
+   ret = __qeth_issue_next_read(card);
+   spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card)));
+
+   return ret;
+}
+
 static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
 {
struct qeth_reply *reply;
@@ -1166,7 +1176,7 @@ static void qeth_irq(struct ccw_device *
return;
if (channel == >read &&
channel->state == CH_STATE_UP)
-   qeth_issue_next_read(card);
+   __qeth_issue_next_read(card);
 
iob = channel->iob;
index = channel->buf_no;