From: Robert Love <rml@tech9.net>
To: jgarzik@pobox.com
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] 8390.c: preemption and disable_irq
Date: 01 Oct 2002 17:58:00 -0400 [thread overview]
Message-ID: <1033509479.12851.34.camel@phantasy> (raw)
Jeff,
Alan pointed out to me that drivers/net/8390.c calls disable_irq() while
non-atomic. This leads to the possibility that the kernel is preempted
while the IRQ line is disabled.
This is not a bug but obviously not optimal. The solution is simply to
disable preemption prior to calling disable_irq().
Patch against 2.5.40 is attached. Look OK?
Robert Love
P.S. Note there is a much simpler solution of merely flipping the
spin_lock() and disable_irq() calls - the spin_lock() will provide the
atomicity without the explicit preempt_disable(). I do not think this
is safe, however, since the IRQ handler could deadlock if it grabbed
this lock (which I assume it does).
diff -urN linux-2.5.40/drivers/net/8390.c linux/drivers/net/8390.c
--- linux-2.5.40/drivers/net/8390.c Tue Oct 1 03:06:17 2002
+++ linux/drivers/net/8390.c Tue Oct 1 17:49:11 2002
@@ -243,7 +243,8 @@
}
/* Ugly but a reset can be slow, yet must be protected */
-
+
+ preempt_disable();
disable_irq_nosync(dev->irq);
spin_lock(&ei_local->page_lock);
@@ -253,6 +254,7 @@
spin_unlock(&ei_local->page_lock);
enable_irq(dev->irq);
+ preempt_enable();
netif_wake_queue(dev);
}
@@ -286,9 +288,9 @@
/*
* Slow phase with lock held.
*/
-
+
+ preempt_disable();
disable_irq_nosync(dev->irq);
-
spin_lock(&ei_local->page_lock);
ei_local->irqlock = 1;
@@ -331,6 +333,7 @@
outb_p(ENISR_ALL, e8390_base + EN0_IMR);
spin_unlock(&ei_local->page_lock);
enable_irq(dev->irq);
+ preempt_enable();
ei_local->stat.tx_errors++;
return 1;
}
@@ -387,6 +390,7 @@
spin_unlock(&ei_local->page_lock);
enable_irq(dev->irq);
+ preempt_enable();
dev_kfree_skb (skb);
ei_local->stat.tx_bytes += send_length;
next reply other threads:[~2002-10-01 21:52 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-01 21:58 Robert Love [this message]
2002-10-02 0:39 ` Alan Cox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1033509479.12851.34.camel@phantasy \
--to=rml@tech9.net \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®