Re: disable_irq() and local_disable_irq() : a quesion

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi John...

Not an expert by myself, just giving ideas...

> when I try , in the same place , (init_module() method) to call
> local_irq_disable() (instead of disable_irq(11) ) the nic DOES
> ping !! and also the keyboard continues to respond ! why is it so ?
> aren't all interrupts (NIC, keyboard and
> others) should be disabled in such a case ? 

I think that's because you use local_irq_disable on multiprocessor or 
multi core system (SMP). Is it correct that you run that code on SMP 
system?

In SMP system, disabling local IRQ (via local_irq_disable) only makes 
certain CPU denies to process an interrupt, but not globally. On the 
other hand, disable_irq() IIRC disables irqs globally, thus affecting 
all CPUs

>In the kernel log I see,
> in the second case, the following:
> Debug: sleeping function called from invalid context at
> include/asm/semaphore.h:102
> in_atomic():0, irqs_disabled():1
> [<c01483b2>] sys_init_module+0xd0/0x1b5
> <c0103a51>] syscall_call+0x7/0xb

Hm. not sure. You call a sleeping function that is not supposed to be 
called inside atomic/interrupt handler? Or because you did disable irq, 
thus kernel assumes you are in atomic context, then it thinks that any 
calls to sleeping function is "illegal".

regards,

Mulyadi


--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux