public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* newbie questions about while (1) in kernel mode and spinlocks
@ 2006-12-21  9:41 Sorin Manolache
  2006-12-21 10:05 ` Paolo Ornati
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Sorin Manolache @ 2006-12-21  9:41 UTC (permalink / raw)
  To: linux-kernel

Dear list,

I am in the process of learning how to write linux device drivers.

I have a 2.6.16.5 kernel running on a monoprocessor machine.
#CONFIG_SMP is not set
CONFIG_DEBUG_SPINLOCK=y.
CONFIG_PREEMPT=y
CONFIG_PREEMPT_BKL=y

First question:

I wrote

while (1)
    ;

in the read function of a test device driver. I expect the calling
process to freeze, and then a timer interrupt to preempt the kernel
and to schedule another process. This does not happen, the whole
system freezes. I see no effect from pressing keys or moving the
mouse. Why? The hardware interrupts are not disabled, are they? Why do
the interrupt handlers not get executed?

Second question:

I wrote

spin_lock(&lck);
down(&sem); /* I know that one shouldn't sleep when holding a lock */
                    /* but I want to understand why */
spin_unlock(&lck);

in the read function and

up(&sem)

in the write function. The semaphore is initially locked, so the first
process invoking down will sleep.

I invoke

cat /dev/test

and the process sleeps on the semaphore. Then I invoke

echo 1 > /dev/test

and I wake up the "cat" process.

Then I intend to invoke _two_ cat processes. I expect the first one to
sleep on the semaphore and the second on to spin at the spin_lock.
Then I expect to wake up the first process by invoking an echo, the
first process to release the lock and the second process to sleep on
the semaphore. What I get is that the system freezes as soon as I
invoke the second "cat" process. Again, no effect from key presses or
mouse movements. Why? Shouldn't the timer interrupt preempt the second
"cat" process that spins on the spinlock and give control to something
else, for example to the console where I could wake up the first "cat"
process? Why do I not see any effect from mouse movements? Hardware
interrupts are not disabled, are they?

Third question:

The Linux Device Drivers book says that a spin_lock should not be
shared between a process and an interrupt handler. The explanation is
that the process may hold the lock, an interrupt occurs, the interrupt
handler spins on the lock held by the process and the system freezes.
Why should it freeze? Isn't it possible for the interrupt handler to
re-enable interrupts as its first thing, then to spin at the lock, the
timer interrupt to preempt the interrupt handler and to relinquish
control to the process which in turn will finish its critical section
and release the lock, making way for the interrupt handler to
continue.

Thank you very much for clarifying these issues.

Regards,
Sorin

^ permalink raw reply	[flat|nested] 7+ messages in thread
[parent not found: <fa.D8ff1OmLNpVeVOoaJAP7ENpm+Wk@ifi.uio.no>]
* RE: newbie questions about while (1) in kernel mode and spinlocks
@ 2006-12-21 18:14 SR, Krishna
  0 siblings, 0 replies; 7+ messages in thread
From: SR, Krishna @ 2006-12-21 18:14 UTC (permalink / raw)
  To: Paolo Ornati, Sorin Manolache; +Cc: linux-kernel

Hi,

Well, Spin lock itself is a while loop. So in case a process on another
CPU has the semaphore and you get a  spin lock and try to wait on a
semaphore and the other CPU also tries to get the spin lock then you are
in a dead loop.


CPU 1                   CPU 2
		            Get sem-1 (success)
				......
Spin lock (success)	.......

...				.....
...				Spin lock??? No you are locked....
Get sem -1 (block)
You are blocked now

That is the reason we always make sure that we never do any thing that
can sleep in a place after we have spin lock.

And as Paolo tells, all these if PREEMPTION is disabled. But in any case
if the signals are not handled then the processes are blocked.

Thanks and Best Regards,
KK
-----Original Message-----
From: Paolo Ornati [mailto:ornati@fastwebnet.it] 
Sent: Thursday, December 21, 2006 2:20 AM
To: Sorin Manolache
Cc: linux-kernel@vger.kernel.org
Subject: Re: newbie questions about while (1) in kernel mode and
spinlocks

On Thu, 21 Dec 2006 10:41:44 +0100
"Sorin Manolache" <sorinm@gmail.com> wrote:

> spin_lock(&lck);
> down(&sem); /* I know that one shouldn't sleep when holding a lock */
>                     /* but I want to understand why */

I suppose because the lock is held for an indefinite amount of time and
any other process that try to get that lock will "spin" and burn CPU
without doing anything useful (locking the process in kernel mode and
preventing the execution of other processes on that CPU if there
isn't any type of PREEMPTION).

:)

spin_lock is a "while(1) {...}" thing...

-- 
	Paolo Ornati
	Linux 2.6.20-rc1-g99f5e971 on x86_64
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2006-12-21 23:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-21  9:41 newbie questions about while (1) in kernel mode and spinlocks Sorin Manolache
2006-12-21 10:05 ` Paolo Ornati
2006-12-21 10:20 ` Paolo Ornati
2006-12-21 10:40 ` Paolo Ornati
2006-12-21 23:54 ` Steven Rostedt
     [not found] <fa.D8ff1OmLNpVeVOoaJAP7ENpm+Wk@ifi.uio.no>
2006-12-21 14:31 ` Robert Hancock
  -- strict thread matches above, loose matches on Subject: below --
2006-12-21 18:14 SR, Krishna

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox