Commit d805d7c6 authored by Frank Pavlic's avatar Frank Pavlic Committed by Jeff Garzik

[PATCH] s390: some more qeth fixes

[patch 4/7] s390: some more qeth fixes

From: Frank Pavlic <fpavlic@de.ibm.com>
From: Peter Tiedemann <ptiedem@de.ibm.com>
	- possible race on list fixed by reset
	  list processing after every operation
	- traffic hang fixed
Signed-off-by: default avatarFrank Pavlic <fpavlic@de.ibm.com>

diffstat:
 qeth_main.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 6c88ad2d
/* /*
* *
* linux/drivers/s390/net/qeth_main.c ($Revision: 1.236 $) * linux/drivers/s390/net/qeth_main.c ($Revision: 1.238 $)
* *
* Linux on zSeries OSA Express and HiperSockets support * Linux on zSeries OSA Express and HiperSockets support
* *
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Frank Pavlic (pavlic@de.ibm.com) and * Frank Pavlic (pavlic@de.ibm.com) and
* Thomas Spatzier <tspat@de.ibm.com> * Thomas Spatzier <tspat@de.ibm.com>
* *
* $Revision: 1.236 $ $Date: 2005/05/04 20:19:18 $ * $Revision: 1.238 $ $Date: 2005/05/04 20:19:18 $
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
#include "qeth_eddp.h" #include "qeth_eddp.h"
#include "qeth_tso.h" #include "qeth_tso.h"
#define VERSION_QETH_C "$Revision: 1.236 $" #define VERSION_QETH_C "$Revision: 1.238 $"
static const char *version = "qeth S/390 OSA-Express driver"; static const char *version = "qeth S/390 OSA-Express driver";
/** /**
...@@ -799,7 +799,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags) ...@@ -799,7 +799,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
{ {
struct qeth_ipaddr *addr, *tmp; struct qeth_ipaddr *addr, *tmp;
int rc; int rc;
again:
list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) { list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
if (addr->is_multicast) { if (addr->is_multicast) {
spin_unlock_irqrestore(&card->ip_lock, *flags); spin_unlock_irqrestore(&card->ip_lock, *flags);
...@@ -808,6 +808,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags) ...@@ -808,6 +808,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
if (!rc) { if (!rc) {
list_del(&addr->entry); list_del(&addr->entry);
kfree(addr); kfree(addr);
goto again;
} }
} }
} }
...@@ -4336,6 +4337,8 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, ...@@ -4336,6 +4337,8 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
out: out:
if (flush_count) if (flush_count)
qeth_flush_buffers(queue, 0, start_index, flush_count); qeth_flush_buffers(queue, 0, start_index, flush_count);
else if (!atomic_read(&queue->set_pci_flags_count))
atomic_swap(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);
/* /*
* queue->state will go from LOCKED -> UNLOCKED or from * queue->state will go from LOCKED -> UNLOCKED or from
* LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment