All of lore.kernel.org
 help / color / mirror / Atom feed
* [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout()
@ 2005-01-17 21:50 Corey Minyard
  2005-01-17 21:53 ` Corey Minyard
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Corey Minyard @ 2005-01-17 21:50 UTC (permalink / raw)
  To: kernel-janitors

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

Why?

-Corey

Nishanth Aravamudan wrote:

>Hi,
>
>Sorry, I was off by one in my total.
>
>Please consider applying. 
>
>Description: Use msleep() instead of schedule_timeout(). I have chosen to use
>msleep(10) here, even though the former calls were schedule_timeout(1), as many
>drivers were not updated to consider the new HZ values. Under HZ==100, the
>existing calls were 10ms delays, which I have returned to with this patch. If 1
>ms was actually desired (or 1 scheduler unit) then the patch can be changed
>appropriately.
>
>Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
>
>
>--- 2.6.11-rc1-kj-v/drivers/char/ipmi/ipmi_si_intf.c	2005-01-15 16:55:41.000000000 -0800
>+++ 2.6.11-rc1-kj/drivers/char/ipmi/ipmi_si_intf.c	2005-01-16 23:35:29.000000000 -0800
>@@ -1880,8 +1880,7 @@ static int try_get_dev_id(struct smi_inf
> 	for (;;)
> 	{
> 		if (smi_result == SI_SM_CALL_WITH_DELAY) {
>-			set_current_state(TASK_UNINTERRUPTIBLE);
>-			schedule_timeout(1);
>+			msleep(10);
> 			smi_result = smi_info->handlers->event(
> 				smi_info->si_sm, 100);
> 		}
>@@ -2153,10 +2152,8 @@ static int init_one_smi(int intf_num, st
> 
> 	/* Wait for the timer to stop.  This avoids problems with race
> 	   conditions removing the timer here. */
>-	while (!new_smi->timer_stopped) {
>-		set_current_state(TASK_UNINTERRUPTIBLE);
>-		schedule_timeout(1);
>-	}
>+	while (!new_smi->timer_stopped)
>+		msleep(10);
> 
>  out_err:
> 	if (new_smi->intf)
>@@ -2280,17 +2277,14 @@ static void __exit cleanup_one_si(struct
> 
> 	/* Wait for the timer to stop.  This avoids problems with race
> 	   conditions removing the timer here. */
>-	while (!to_clean->timer_stopped) {
>-		set_current_state(TASK_UNINTERRUPTIBLE);
>-		schedule_timeout(1);
>-	}
>+	while (!to_clean->timer_stopped)
>+		msleep(10);
> 
> 	/* Interrupts and timeouts are stopped, now make sure the
> 	   interface is in a clean state. */
> 	while ((to_clean->curr_msg) || (to_clean->si_state != SI_NORMAL)) {
> 		poll(to_clean);
>-		set_current_state(TASK_UNINTERRUPTIBLE);
>-		schedule_timeout(1);
>+		msleep(10);
> 	}
> 
> 	rv = ipmi_unregister_smi(to_clean->intf);
>  
>


[-- Attachment #2: Type: text/plain, Size: 167 bytes --]

_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors

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

* [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout()
  2005-01-17 21:50 [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout() Corey Minyard
@ 2005-01-17 21:53 ` Corey Minyard
  2005-01-17 22:31 ` Nishanth Aravamudan
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Corey Minyard @ 2005-01-17 21:53 UTC (permalink / raw)
  To: kernel-janitors

On my previous question, to be more clear, why was this change 
necessary?  In this particular instance, it doesn't matter how long it 
sleeps, it just can't spin waiting for something to happen.  msleep() 
spins, right?  That would be very bad in this code.  Even if not, the 
particular timing is not important.

-Corey

Nishanth Aravamudan wrote:

>Hi,
>
>Sorry, I was off by one in my total.
>
>Please consider applying. 
>
>Description: Use msleep() instead of schedule_timeout(). I have chosen to use
>msleep(10) here, even though the former calls were schedule_timeout(1), as many
>drivers were not updated to consider the new HZ values. Under HZ=100, the
>existing calls were 10ms delays, which I have returned to with this patch. If 1
>ms was actually desired (or 1 scheduler unit) then the patch can be changed
>appropriately.
>
>Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
>
>
>--- 2.6.11-rc1-kj-v/drivers/char/ipmi/ipmi_si_intf.c	2005-01-15 16:55:41.000000000 -0800
>+++ 2.6.11-rc1-kj/drivers/char/ipmi/ipmi_si_intf.c	2005-01-16 23:35:29.000000000 -0800
>@@ -1880,8 +1880,7 @@ static int try_get_dev_id(struct smi_inf
> 	for (;;)
> 	{
> 		if (smi_result = SI_SM_CALL_WITH_DELAY) {
>-			set_current_state(TASK_UNINTERRUPTIBLE);
>-			schedule_timeout(1);
>+			msleep(10);
> 			smi_result = smi_info->handlers->event(
> 				smi_info->si_sm, 100);
> 		}
>@@ -2153,10 +2152,8 @@ static int init_one_smi(int intf_num, st
> 
> 	/* Wait for the timer to stop.  This avoids problems with race
> 	   conditions removing the timer here. */
>-	while (!new_smi->timer_stopped) {
>-		set_current_state(TASK_UNINTERRUPTIBLE);
>-		schedule_timeout(1);
>-	}
>+	while (!new_smi->timer_stopped)
>+		msleep(10);
> 
>  out_err:
> 	if (new_smi->intf)
>@@ -2280,17 +2277,14 @@ static void __exit cleanup_one_si(struct
> 
> 	/* Wait for the timer to stop.  This avoids problems with race
> 	   conditions removing the timer here. */
>-	while (!to_clean->timer_stopped) {
>-		set_current_state(TASK_UNINTERRUPTIBLE);
>-		schedule_timeout(1);
>-	}
>+	while (!to_clean->timer_stopped)
>+		msleep(10);
> 
> 	/* Interrupts and timeouts are stopped, now make sure the
> 	   interface is in a clean state. */
> 	while ((to_clean->curr_msg) || (to_clean->si_state != SI_NORMAL)) {
> 		poll(to_clean);
>-		set_current_state(TASK_UNINTERRUPTIBLE);
>-		schedule_timeout(1);
>+		msleep(10);
> 	}
> 
> 	rv = ipmi_unregister_smi(to_clean->intf);
>  
>

_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors

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

* [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout()
  2005-01-17 21:50 [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout() Corey Minyard
  2005-01-17 21:53 ` Corey Minyard
@ 2005-01-17 22:31 ` Nishanth Aravamudan
  2005-01-17 22:41 ` Corey Minyard
  2005-01-17 22:44 ` Nishanth Aravamudan
  3 siblings, 0 replies; 5+ messages in thread
From: Nishanth Aravamudan @ 2005-01-17 22:31 UTC (permalink / raw)
  To: kernel-janitors

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

On Mon, Jan 17, 2005 at 03:53:12PM -0600, Corey Minyard wrote:
> On my previous question, to be more clear, why was this change 
> necessary?  In this particular instance, it doesn't matter how long it 
> sleeps, it just can't spin waiting for something to happen.  msleep() 
> spins, right?  That would be very bad in this code.  Even if not, the 
> particular timing is not important.

msleep() does not spin. The name itself is intended to indicate this. Delays
(mdelay(), udelay()) spin by looping tightly. Sleeps (msleep(), ssleep(), 
msleep_interruptible()) use schedule_timeout() to give up the CPU for a certain
amount of time.

Given this last comment, there is a clear benefit (IMO) to use actual time
units for sleeps (msleep() and co. use milliseconds or seconds) as opposed to
jiffy-relative units (as in schedule_timeout() where you are requesting a delay
in jiffies, which varies from arch to arch).

This becomes very important with dynamic HZ, for instance. Clearly if HZ
changes, then the delay caused by schedule_timeout(1) will change, which is not
necessarily desired and may be confusing the user. A time specified in real
time units will be adjusted with the change in HZ.

If it is not important how long the driver sleeps, then I believe msleep()
should be preferred in effectively all cases (depending on whether wait-queue
events or signals may be important early triggers, of course). Milliseconds
indicate a clear delay, independent of HZ's value. Jiffy delays have a clear
reliance on the value of HZ.

I am open to other suggestions, but I think these are good reasons. Another
basic one is that it will lead to consistency across the board. HZ is not a
measure of time, it should not be used as a measure of time. Instead,
milliseconds should be used and, when/if the facility has been added,
microseconds and nanoseconds.

Thanks,
Nish

[-- Attachment #2: Type: text/plain, Size: 167 bytes --]

_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors

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

* [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout()
  2005-01-17 21:50 [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout() Corey Minyard
  2005-01-17 21:53 ` Corey Minyard
  2005-01-17 22:31 ` Nishanth Aravamudan
@ 2005-01-17 22:41 ` Corey Minyard
  2005-01-17 22:44 ` Nishanth Aravamudan
  3 siblings, 0 replies; 5+ messages in thread
From: Corey Minyard @ 2005-01-17 22:41 UTC (permalink / raw)
  To: kernel-janitors

Ok, I was unaware of the difference between msleep and mdelay (I was 
actually reading "mdelay").

Actually, in the code I want to wait as small a time as possible without 
spinning.  The operations being waited for generally happen in ~500us, 
which is far too long to spin, but 10ms would be non-optimal if a faster 
increment was available.  So I think it is still best as it is.

Thanks,

-Corey

Nishanth Aravamudan wrote:

>On Mon, Jan 17, 2005 at 03:53:12PM -0600, Corey Minyard wrote:
>  
>
>>On my previous question, to be more clear, why was this change 
>>necessary?  In this particular instance, it doesn't matter how long it 
>>sleeps, it just can't spin waiting for something to happen.  msleep() 
>>spins, right?  That would be very bad in this code.  Even if not, the 
>>particular timing is not important.
>>    
>>
>
>msleep() does not spin. The name itself is intended to indicate this. Delays
>(mdelay(), udelay()) spin by looping tightly. Sleeps (msleep(), ssleep(), 
>msleep_interruptible()) use schedule_timeout() to give up the CPU for a certain
>amount of time.
>
>Given this last comment, there is a clear benefit (IMO) to use actual time
>units for sleeps (msleep() and co. use milliseconds or seconds) as opposed to
>jiffy-relative units (as in schedule_timeout() where you are requesting a delay
>in jiffies, which varies from arch to arch).
>
>This becomes very important with dynamic HZ, for instance. Clearly if HZ
>changes, then the delay caused by schedule_timeout(1) will change, which is not
>necessarily desired and may be confusing the user. A time specified in real
>time units will be adjusted with the change in HZ.
>
>If it is not important how long the driver sleeps, then I believe msleep()
>should be preferred in effectively all cases (depending on whether wait-queue
>events or signals may be important early triggers, of course). Milliseconds
>indicate a clear delay, independent of HZ's value. Jiffy delays have a clear
>reliance on the value of HZ.
>
>I am open to other suggestions, but I think these are good reasons. Another
>basic one is that it will lead to consistency across the board. HZ is not a
>measure of time, it should not be used as a measure of time. Instead,
>milliseconds should be used and, when/if the facility has been added,
>microseconds and nanoseconds.
>
>Thanks,
>Nish
>  
>

_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors

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

* [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout()
  2005-01-17 21:50 [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout() Corey Minyard
                   ` (2 preceding siblings ...)
  2005-01-17 22:41 ` Corey Minyard
@ 2005-01-17 22:44 ` Nishanth Aravamudan
  3 siblings, 0 replies; 5+ messages in thread
From: Nishanth Aravamudan @ 2005-01-17 22:44 UTC (permalink / raw)
  To: kernel-janitors

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

On Mon, Jan 17, 2005 at 04:41:15PM -0600, Corey Minyard wrote:
> Ok, I was unaware of the difference between msleep and mdelay (I was 
> actually reading "mdelay").
> 
> Actually, in the code I want to wait as small a time as possible without 
> spinning.  The operations being waited for generally happen in ~500us, 
> which is far too long to spin, but 10ms would be non-optimal if a faster 
> increment was available.  So I think it is still best as it is.

Yup, sounds right to me. Thanks for your help & responses!

-Nish

[-- Attachment #2: Type: text/plain, Size: 167 bytes --]

_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors

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

end of thread, other threads:[~2005-01-17 22:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-17 21:50 [KJ] Re: [PATCH 9/21] char/ipmi_si_intf: replace schedule_timeout() Corey Minyard
2005-01-17 21:53 ` Corey Minyard
2005-01-17 22:31 ` Nishanth Aravamudan
2005-01-17 22:41 ` Corey Minyard
2005-01-17 22:44 ` Nishanth Aravamudan

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.