From: "David S. Miller" <davem@redhat.com>
To: torvalds@transmeta.com
Cc: dane@aiinet.com, shmulik.hen@intel.com,
bonding-devel@lists.sourceforge.net,
bonding-announce@lists.sourceforge.net, netdev@oss.sgi.com,
linux-kernel@vger.kernel.org, linux-net@vger.kernel.org,
mingo@redhat.com, kuznet@ms2.inr.ac.ru
Subject: Re: BUG or not? GFP_KERNEL with interrupts disabled.
Date: Thu, 27 Mar 2003 12:55:07 -0800 (PST) [thread overview]
Message-ID: <20030327.125507.104718048.davem@redhat.com> (raw)
In-Reply-To: <20030327.113933.123322481.davem@redhat.com>
From: "David S. Miller" <davem@redhat.com>
Date: Thu, 27 Mar 2003 11:39:33 -0800 (PST)
From: Linus Torvalds <torvalds@transmeta.com>
Date: Thu, 27 Mar 2003 11:22:55 -0800 (PST)
if (gfp_mask & __GFP_WAIT)
might_sleep();
and might_sleep() should be updated.
Anybody want to try that and see whether things break horribly?
I hadn't considered this, good idea. I'm trying this out right now.
Ok, I'm running this now and it appears to work.
i386 will need similar changes to it's irq_exit() call sites.
One might_sleep still triggers, the cpufreq_register_notifier() call
during boot. It takes a rwsem. This will trigger on i386 too with
TSC and CPUFREQ both enabled.
Oh yeah, the fbcon cursor thing triggers too, but that's been
discussed to death in another thread and hopefully a fix will
be pushed upstream soon by the fbcon guys.
--- ./arch/sparc64/kernel/smp.c.~1~ Thu Mar 27 11:57:41 2003
+++ ./arch/sparc64/kernel/smp.c Thu Mar 27 12:05:46 2003
@@ -1055,11 +1055,10 @@ void smp_percpu_timer_interrupt(struct p
clear_softint(tick_mask);
}
+ irq_enter();
do {
sparc64_do_profile(regs);
if (!--prof_counter(cpu)) {
- irq_enter();
-
if (cpu == boot_cpu_id) {
kstat_cpu(cpu).irqs[0]++;
timer_tick_interrupt(regs);
@@ -1067,7 +1066,6 @@ void smp_percpu_timer_interrupt(struct p
update_process_times(user);
- irq_exit();
prof_counter(cpu) = prof_multiplier(cpu);
}
@@ -1088,6 +1086,9 @@ void smp_percpu_timer_interrupt(struct p
: /* no outputs */
: "r" (pstate));
} while (time_after_eq(tick, compare));
+
+ local_irq_enable();
+ irq_exit();
}
static void __init smp_setup_percpu_timer(void)
--- ./arch/sparc64/kernel/irq.c.~1~ Thu Mar 27 11:57:41 2003
+++ ./arch/sparc64/kernel/irq.c Thu Mar 27 12:42:13 2003
@@ -356,7 +356,7 @@ int request_irq(unsigned int irq, void (
}
if (action == NULL)
action = (struct irqaction *)kmalloc(sizeof(struct irqaction),
- GFP_KERNEL);
+ GFP_ATOMIC);
if (!action) {
spin_unlock_irqrestore(&irq_action_lock, flags);
@@ -376,7 +376,7 @@ int request_irq(unsigned int irq, void (
goto free_and_ebusy;
}
if ((bucket->flags & IBF_MULTI) == 0) {
- vector = kmalloc(sizeof(void *) * 4, GFP_KERNEL);
+ vector = kmalloc(sizeof(void *) * 4, GFP_ATOMIC);
if (vector == NULL)
goto free_and_enomem;
@@ -793,6 +793,7 @@ void handler_irq(int irq, struct pt_regs
bp->flags &= ~IBF_INPROGRESS;
}
+ local_irq_enable();
irq_exit();
}
@@ -900,7 +901,7 @@ int request_fast_irq(unsigned int irq,
}
if (action == NULL)
action = (struct irqaction *)kmalloc(sizeof(struct irqaction),
- GFP_KERNEL);
+ GFP_ATOMIC);
if (!action) {
spin_unlock_irqrestore(&irq_action_lock, flags);
return -ENOMEM;
--- ./arch/sparc64/kernel/traps.c.~1~ Thu Mar 27 12:13:23 2003
+++ ./arch/sparc64/kernel/traps.c Thu Mar 27 12:15:53 2003
@@ -1575,6 +1575,9 @@ void show_trace_raw(struct thread_info *
struct reg_window *rw;
int count = 0;
+ if (tp == current_thread_info())
+ flushw_all();
+
fp = ksp + STACK_BIAS;
thread_base = (unsigned long) tp;
do {
@@ -1595,6 +1598,15 @@ void show_trace_task(struct task_struct
if (tsk)
show_trace_raw(tsk->thread_info,
tsk->thread_info->ksp);
+}
+
+void dump_stack(void)
+{
+ unsigned long ksp;
+
+ __asm__ __volatile__("mov %%fp, %0"
+ : "=r" (ksp));
+ show_trace_raw(current_thread_info(), ksp);
}
void die_if_kernel(char *str, struct pt_regs *regs)
--- ./kernel/sched.c.~1~ Thu Mar 27 11:27:01 2003
+++ ./kernel/sched.c Thu Mar 27 11:27:41 2003
@@ -2554,7 +2554,7 @@ void __might_sleep(char *file, int line)
#if defined(in_atomic)
static unsigned long prev_jiffy; /* ratelimiting */
- if (in_atomic()) {
+ if (in_atomic() || irqs_disabled()) {
if (time_before(jiffies, prev_jiffy + HZ))
return;
prev_jiffy = jiffies;
--- ./kernel/softirq.c.~1~ Thu Mar 27 11:28:20 2003
+++ ./kernel/softirq.c Thu Mar 27 11:52:35 2003
@@ -60,6 +60,9 @@ asmlinkage void do_softirq()
if (in_interrupt())
return;
+ if (irqs_disabled())
+ BUG();
+
local_irq_save(flags);
cpu = smp_processor_id();
--- ./net/core/skbuff.c.~1~ Thu Mar 27 11:28:53 2003
+++ ./net/core/skbuff.c Thu Mar 27 11:29:12 2003
@@ -170,15 +170,8 @@ struct sk_buff *alloc_skb(unsigned int s
struct sk_buff *skb;
u8 *data;
- if (in_interrupt() && (gfp_mask & __GFP_WAIT)) {
- static int count;
- if (++count < 5) {
- printk(KERN_ERR "alloc_skb called nonatomically "
- "from interrupt %p\n", NET_CALLER(size));
- BUG();
- }
- gfp_mask &= ~__GFP_WAIT;
- }
+ if (gfp_mask & __GFP_WAIT)
+ might_sleep();
/* Get the HEAD */
skb = skb_head_from_pool();
next prev parent reply other threads:[~2003-03-27 20:55 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <3B785392832ED71192AE00D0B7B0D75B539668@aimail.aiinet.com>
2003-03-27 19:02 ` BUG or not? GFP_KERNEL with interrupts disabled Dan Eble
2003-03-27 19:08 ` Linus Torvalds
2003-03-27 19:10 ` David S. Miller
2003-03-27 19:22 ` Linus Torvalds
2003-03-27 19:39 ` David S. Miller
2003-03-27 19:52 ` Robert Love
2003-03-27 19:53 ` David S. Miller
2003-03-27 20:55 ` David S. Miller [this message]
2003-03-27 21:29 ` David S. Miller
[not found] <E791C176A6139242A988ABA8B3D9B38A01085638@hasmsx403.iil.intel.com>
2003-03-27 13:32 ` shmulik.hen
2003-03-27 13:43 ` David S. Miller
2003-03-27 14:11 ` Trond Myklebust
2003-03-27 14:12 ` David S. Miller
2003-03-27 17:22 ` Linus Torvalds
2003-03-27 17:55 ` David S. Miller
2003-03-27 18:04 ` Linus Torvalds
2003-03-27 18:07 ` David S. Miller
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=20030327.125507.104718048.davem@redhat.com \
--to=davem@redhat.com \
--cc=bonding-announce@lists.sourceforge.net \
--cc=bonding-devel@lists.sourceforge.net \
--cc=dane@aiinet.com \
--cc=kuznet@ms2.inr.ac.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-net@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=netdev@oss.sgi.com \
--cc=shmulik.hen@intel.com \
--cc=torvalds@transmeta.com \
/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;
as well as URLs for NNTP newsgroup(s).