All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] introduce setup_timer() helper
@ 2005-09-18 13:51 Oleg Nesterov
  2005-09-18 15:12 ` Arjan van de Ven
  0 siblings, 1 reply; 7+ messages in thread
From: Oleg Nesterov @ 2005-09-18 13:51 UTC (permalink / raw)
  To: linux-kernel; +Cc: Andrew Morton

Every user of init_timer() also needs to initialize ->function and
->data fields. This patch adds a simple setup_timer() helper for that.

The schedule_timeout() is patched as an example of usage.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>

--- 2.6.14-rc1/include/linux/timer.h~4_SETUP	2005-09-17 18:57:30.000000000 +0400
+++ 2.6.14-rc1/include/linux/timer.h	2005-09-18 20:55:15.000000000 +0400
@@ -38,6 +38,15 @@ extern struct timer_base_s __init_timer_
 
 void fastcall init_timer(struct timer_list * timer);
 
+static inline void setup_timer(struct timer_list * timer,
+				void (*function)(unsigned long),
+				unsigned long data)
+{
+	timer->function = function;
+	timer->data = data;
+	init_timer(timer);
+}
+
 /***
  * timer_pending - is a timer pending?
  * @timer: the timer in question
--- 2.6.14-rc1/kernel/timer.c~4_SETUP	2005-09-17 18:57:30.000000000 +0400
+++ 2.6.14-rc1/kernel/timer.c	2005-09-18 20:59:43.000000000 +0400
@@ -1137,12 +1137,8 @@ fastcall signed long __sched schedule_ti
 
 	expire = timeout + jiffies;
 
-	init_timer(&timer);
-	timer.expires = expire;
-	timer.data = (unsigned long) current;
-	timer.function = process_timeout;
-
-	add_timer(&timer);
+	setup_timer(&timer, process_timeout, (unsigned long)current);
+	__mod_timer(&timer, expire);
 	schedule();
 	del_singleshot_timer_sync(&timer);

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

* Re: [PATCH] introduce setup_timer() helper
  2005-09-18 13:51 [PATCH] introduce setup_timer() helper Oleg Nesterov
@ 2005-09-18 15:12 ` Arjan van de Ven
  2005-09-18 15:51   ` Oleg Nesterov
  0 siblings, 1 reply; 7+ messages in thread
From: Arjan van de Ven @ 2005-09-18 15:12 UTC (permalink / raw)
  To: Oleg Nesterov; +Cc: Andrew Morton, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 218 bytes --]

> 				unsigned long data)
> +{
> +	timer->function = function;
> +	timer->data = data;
> +	init_timer(timer);
> +}

are you sure you want to do this in this order???
I'd expect the init_timer to be first...


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: [PATCH] introduce setup_timer() helper
  2005-09-18 15:51   ` Oleg Nesterov
@ 2005-09-18 15:43     ` Arjan van de Ven
  2005-09-18 16:22       ` Oleg Nesterov
  0 siblings, 1 reply; 7+ messages in thread
From: Arjan van de Ven @ 2005-09-18 15:43 UTC (permalink / raw)
  To: Oleg Nesterov; +Cc: Andrew Morton, linux-kernel


On Sun, Sep 18, 2005 at 07:51:20PM +0400, Oleg Nesterov wrote:
> Arjan van de Ven wrote:
> > 
> > >                               unsigned long data)
> > > +{
> > > +     timer->function = function;
> > > +     timer->data = data;
> > > +     init_timer(timer);
> > > +}
> > 
> > are you sure you want to do this in this order???
> > I'd expect the init_timer to be first...
> 
> I think it does not matter from correctness point of view.

right now.. it probably doesn't.
However I think conceptually, touching a timer before init_timer() is just
wrong. For one... it would prevent init_timer() from being able to use
memset() on the timer. Which it doesn't today but it's the kind of thing
that you don't want to prevent happening in the future.

> 	setup_timer(timer, expr1(), expr2())
> 
> it is better to initialize ->func and ->data first, otherwise
> the compiler should save the results from expr{1,2}, then call
> init_timer(), then copy these results to *timer.

I don't see how that is different.... 

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

* Re: [PATCH] introduce setup_timer() helper
  2005-09-18 15:12 ` Arjan van de Ven
@ 2005-09-18 15:51   ` Oleg Nesterov
  2005-09-18 15:43     ` Arjan van de Ven
  0 siblings, 1 reply; 7+ messages in thread
From: Oleg Nesterov @ 2005-09-18 15:51 UTC (permalink / raw)
  To: arjanv; +Cc: Andrew Morton, linux-kernel

Arjan van de Ven wrote:
> 
> >                               unsigned long data)
> > +{
> > +     timer->function = function;
> > +     timer->data = data;
> > +     init_timer(timer);
> > +}
> 
> are you sure you want to do this in this order???
> I'd expect the init_timer to be first...

I think it does not matter from correctness point of view.

But if we have:

	setup_timer(timer, expr1(), expr2())

it is better to initialize ->func and ->data first, otherwise
the compiler should save the results from expr{1,2}, then call
init_timer(), then copy these results to *timer.

Oleg.

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

* Re: [PATCH] introduce setup_timer() helper
  2005-09-18 15:43     ` Arjan van de Ven
@ 2005-09-18 16:22       ` Oleg Nesterov
  2005-09-18 20:06         ` Andrew Morton
  0 siblings, 1 reply; 7+ messages in thread
From: Oleg Nesterov @ 2005-09-18 16:22 UTC (permalink / raw)
  To: Arjan van de Ven; +Cc: Andrew Morton, linux-kernel

Arjan van de Ven wrote:
> 
> On Sun, Sep 18, 2005 at 07:51:20PM +0400, Oleg Nesterov wrote:
> >
> > I think it does not matter from correctness point of view.
> 
> right now.. it probably doesn't.
> However I think conceptually, touching a timer before init_timer() is just
> wrong.

It is indeed wrong outside timer.{h,c}, but setup_timer() is a
part of timers subsystem, so I hope it's ok.

> For one... it would prevent init_timer() from being able to use
> memset() on the timer. Which it doesn't today but it's the kind of thing
> that you don't want to prevent happening in the future.

Yes, in that case we will have to change setup_timer(). But I
doubt this will happen. init_timer() only needs to set timer's
->base, and to ensure the timer is not pending.

> 
> >       setup_timer(timer, expr1(), expr2())
> >
> > it is better to initialize ->func and ->data first, otherwise
> > the compiler should save the results from expr{1,2}, then call
> > init_timer(), then copy these results to *timer.
> 
> I don't see how that is different....

I think this can save a couple of cpu cycles. The init_timer()
is not inline, gcc can't reorder exprx() and init_timer() calls.

Ok, I do not want to persist very much, I can resend this patch.

Andrew, should I?

Oleg.

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

* Re: [PATCH] introduce setup_timer() helper
  2005-09-18 16:22       ` Oleg Nesterov
@ 2005-09-18 20:06         ` Andrew Morton
  2005-09-19 15:11           ` Oleg Nesterov
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Morton @ 2005-09-18 20:06 UTC (permalink / raw)
  To: Oleg Nesterov; +Cc: arjanv, linux-kernel

Oleg Nesterov <oleg@tv-sign.ru> wrote:
>
> I think this can save a couple of cpu cycles. The init_timer()
>  is not inline, gcc can't reorder exprx() and init_timer() calls.
> 
>  Ok, I do not want to persist very much, I can resend this patch.
> 
>  Andrew, should I?

Try both, see which one generates the shorter code?

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

* Re: [PATCH] introduce setup_timer() helper
  2005-09-18 20:06         ` Andrew Morton
@ 2005-09-19 15:11           ` Oleg Nesterov
  0 siblings, 0 replies; 7+ messages in thread
From: Oleg Nesterov @ 2005-09-19 15:11 UTC (permalink / raw)
  To: Andrew Morton; +Cc: arjanv, linux-kernel

Andrew Morton wrote:
> 
> Oleg Nesterov <oleg@tv-sign.ru> wrote:
> >
> > I think this can save a couple of cpu cycles. The init_timer()
> >  is not inline, gcc can't reorder exprx() and init_timer() calls.
> >
> >  Ok, I do not want to persist very much, I can resend this patch.
> >
> >  Andrew, should I?
> 
> Try both, see which one generates the shorter code?

The code:

	void *expr(void);

	void tst(struct timer_list *timer)
	{
		setup_timer(timer, expr(), 0);
	}

Asm output:

     1  tst:
     2          pushl   %ebp
     3          movl    %esp, %ebp
     4          pushl   %ebx
     5          movl    8(%ebp), %ebx
     6          call    expr
     7          movl    %eax, 16(%ebx)
     8          movl    %ebx, %eax
     9          movl    $0, 20(%ebx)
    10          call    init_timer
    11          popl    %ebx
    12          popl    %ebp
    13          ret

After the Arjan proposed change:

     1  tst:
     2          pushl   %ebp
     3          movl    %esp, %ebp
     4          subl    $8, %esp
     5          movl    %ebx, (%esp)
     6          movl    8(%ebp), %ebx
     7          movl    %esi, 4(%esp)
     8          call    expr
     9          movl    %eax, %esi
    10          movl    %ebx, %eax
    11          call    init_timer
    12          movl    %esi, 16(%ebx)
    13          movl    $0, 20(%ebx)
    14          movl    (%esp), %ebx
    15          movl    4(%esp), %esi
    16          movl    %ebp, %esp
    17          popl    %ebp
    18          ret

I don't think we'll see any difference in practice, but still...

Oleg.

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

end of thread, other threads:[~2005-09-19 15:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-18 13:51 [PATCH] introduce setup_timer() helper Oleg Nesterov
2005-09-18 15:12 ` Arjan van de Ven
2005-09-18 15:51   ` Oleg Nesterov
2005-09-18 15:43     ` Arjan van de Ven
2005-09-18 16:22       ` Oleg Nesterov
2005-09-18 20:06         ` Andrew Morton
2005-09-19 15:11           ` Oleg Nesterov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.