2006-12-05 14:10:38

by Jaswinder Singh Rajput

[permalink] [raw]
Subject: PREEMPT is messing with everyone

Hi,

preempt stuff SHOULD only stay in #ifdef CONFIG_PREEMP_* , but it is
messing with everyone even though not defined.

e.g.

1. linux-2.6.19/kernel/spinlock.c

Line 18: #include <linux/preempt.h>

Line 26: preempt_disable();

Line 32: preempt_disable();

and so on .

2. linux-2.6.19/kernel/sched.c

Line 1096: int preempted;

Line 1104: preempted = !task_running(rq, p);

Line 1106: if (preempted)

Line 2059: if (TASK_PREEMPTS_CURR(p, this_rq))

Line 3355: current->comm, preempt_count(), current->pid);

Line 3342: preempt_disable();

Line 3375: if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {

Line 3471: preempt_enable_no_resched();

3. linux-2.6.19/kernel/timer.c

Line 444: int preempt_count = preempt_count();

Line 447: if (preempt_count != preempt_count()) {

4. linux-2.6.19/arch/i386/kernel/entry.S

Line 240: preempt_stop

5. linux-2.6.19/arch/i386/irq.c

Line 111: irqctx->tinfo.preempt_count =

Line 112: (irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK) |

Line 113: (curctx->tinfo.preempt_count & SOFTIRQ_MASK);

Line 160: irqctx->tinfo.preempt_count = HARDIRQ_OFFSET;

and so on.

Similarly unnecessary preempt code is also written in other important files.

70 to 80 % of this code is removed when compiled.

but 20 to 30 % code left in binary kernel image.

Why Linux kernel is wasting its resources which is not defined at all.

Any solution ?

Thank you,

Best Regards,

Jaswinder Singh.


2006-12-05 15:08:16

by Michal Schmidt

[permalink] [raw]
Subject: Re: PREEMPT is messing with everyone

Jaswinder Singh wrote:
> Hi,
>
> preempt stuff SHOULD only stay in #ifdef CONFIG_PREEMP_* , but it is
> messing with everyone even though not defined.
>
> e.g.
>
> 1. linux-2.6.19/kernel/spinlock.c
>
> Line 18: #include <linux/preempt.h>
>
> Line 26: preempt_disable();
>
> Line 32: preempt_disable();
>
> and so on .

Don't worry. These compile into "do { } while (0)" (i.e. nothing) when
CONFIG_PREEMPT is not set.

>
> 2. linux-2.6.19/kernel/sched.c
>
> Line 1096: int preempted;
>
> Line 1104: preempted = !task_running(rq, p);
>
> Line 1106: if (preempted)
>
> Line 2059: if (TASK_PREEMPTS_CURR(p, this_rq))

Linux always does preemptive multitasking of user tasks. These have
nothing to do with CONFIG_PREEMPT.

> Line 3355: current->comm, preempt_count(), current->pid);
>
> Line 3342: preempt_disable();
>
> Line 3375: if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {

preempt_count() is useful in !CONFIG_PREEMPT kernels too. It stores
information about the current context (hardirq, softirq, ...).

> [...]
>
> 70 to 80 % of this code is removed when compiled.
>
> but 20 to 30 % code left in binary kernel image.
>
> Why Linux kernel is wasting its resources which is not defined at all.

I don't think that's the case.

> Any solution ?
>
> Thank you,
>
> Best Regards,
>
> Jaswinder Singh.

Michal

2006-12-05 16:50:40

by Jaswinder Singh Rajput

[permalink] [raw]
Subject: Re: PREEMPT is messing with everyone

On 12/5/06, Michal Schmidt <[email protected]> wrote:
> Jaswinder Singh wrote:
> > Hi,
> >
> > preempt stuff SHOULD only stay in #ifdef CONFIG_PREEMP_* , but it is
> > messing with everyone even though not defined.
> >
> > e.g.
> >
> > 1. linux-2.6.19/kernel/spinlock.c
> >
> > Line 18: #include <linux/preempt.h>
> >
> > Line 26: preempt_disable();
> >
> > Line 32: preempt_disable();
> >
> > and so on .
>
> Don't worry. These compile into "do { } while (0)" (i.e. nothing) when
> CONFIG_PREEMPT is not set.
>

Yes, Compiler will remove it but this looks ugly and confusing.

Why dont we use like this :-

#ifdef CONFIG_PREEMPT
#include <linux/preempt.h>
#endif

#ifdef CONFIG_PREEMPT
preempt_disable();
#endif

#ifdef CONFIG_PREEMPT
preempt_enable();
#endif

Regards,

Jaswinder Singh.

2006-12-05 16:59:26

by Michal Schmidt

[permalink] [raw]
Subject: Re: PREEMPT is messing with everyone

Jaswinder Singh skrev:
> Yes, Compiler will remove it but this looks ugly and confusing.
>
> Why dont we use like this :-
>
> #ifdef CONFIG_PREEMPT
> #include <linux/preempt.h>
> #endif
>
> #ifdef CONFIG_PREEMPT
> preempt_disable();
> #endif
>
> #ifdef CONFIG_PREEMPT
> preempt_enable();
> #endif

Surely you're joking.
It is much more readable and maintainable to hide the #ifdef-hackery in
header files than to clutter the *.c files.

Michal

2006-12-05 19:51:52

by Bill Davidsen

[permalink] [raw]
Subject: Re: PREEMPT is messing with everyone

Jaswinder Singh wrote:
> On 12/5/06, Michal Schmidt <[email protected]> wrote:
>> Jaswinder Singh wrote:
>> > Hi,
>> >
>> > preempt stuff SHOULD only stay in #ifdef CONFIG_PREEMP_* , but it is
>> > messing with everyone even though not defined.
>> >
>> > e.g.
>> >
>> > 1. linux-2.6.19/kernel/spinlock.c
>> >
>> > Line 18: #include <linux/preempt.h>
>> >
>> > Line 26: preempt_disable();
>> >
>> > Line 32: preempt_disable();
>> >
>> > and so on .
>>
>> Don't worry. These compile into "do { } while (0)" (i.e. nothing) when
>> CONFIG_PREEMPT is not set.
>>
>
> Yes, Compiler will remove it but this looks ugly and confusing.
>
> Why dont we use like this :-

Because it's ugly and confusing.
>
> #ifdef CONFIG_PREEMPT
> #include <linux/preempt.h>
> #endif
>
> #ifdef CONFIG_PREEMPT
> preempt_disable();
> #endif
>
> #ifdef CONFIG_PREEMPT
> preempt_enable();
> #endif


--
bill davidsen <[email protected]>
CTO TMR Associates, Inc
Doing interesting things with small computers since 1979

2006-12-05 20:30:54

by Jan Engelhardt

[permalink] [raw]
Subject: Re: PREEMPT is messing with everyone


> Yes, Compiler will remove it but this looks ugly and confusing.
>
> Why dont we use like this :-

Even more fugly.

> # ifdef CONFIG_PREEMPT
> # include <linux/preempt.h>
> # endif
>
> #ifdef CONFIG_PREEMPT
> preempt_disable();
> #endif
>
> #ifdef CONFIG_PREEMPT
> preempt_enable();
> #endif
>

-`J'
--