RFR(s): 8214180: Need better granularity for sleeping

David Holmes david.holmes at oracle.com
Fri Nov 30 04:39:18 UTC 2018


On 28/11/2018 9:31 pm, Robbin Ehn wrote:
> Hi,
> 
> I added a new version of the comment to yield:
> http://cr.openjdk.java.net/~rehn/8214180/v2/inc/webrev/
> 
> Let me know if that seem like a good way.

Good placement. Not sure why you rewrote it. There are a number of 
grammatical issues with the new version:

+ // Linux CFS scheduler (since 2.6.23) do not guarantee sched_yield(2) will

s/do/does/

+ // actually give up the CPU. Since skip buddy (v2.6.28):
+ //
+ // * Set the yielding task as skip buddy for current CPU's run queue.

s/Set/Sets/

+ // * Pick next from run queue, if empty, pick a skip buddy (can be the 
yielding task).

s/Pick/Picks/

s/pick/picks/


+ // * Clear skip buddies for this run queue (yielding task no longer a 
skip buddy).

s/Clear/Clears/

+ //
+ // An alternative is calling os::naked_short_nanosleep with a small 
number avoid

s/avoid/to avoid/

+ // getting re-scheduled immediately.
+ //

Thanks,
David

> /Robbin
> 
> On 2018-11-26 23:45, David Holmes wrote:
>> On 27/11/2018 12:32 am, Daniel D. Daugherty wrote:
>>> On 11/24/18 3:38 PM, Robbin Ehn wrote:
>>>> Hi Dan,
>>>>
>>>> On 2018-11-24 15:28, Daniel D. Daugherty wrote:
>>>>> src/hotspot/os/linux/os_linux.cpp
>>>>>      old L4030 // Short sleep, direct OS call.
>>>>>      old L4031 //
>>>>>      old L4032 // Note: certain versions of Linux CFS scheduler 
>>>>> (since 2.6.23) do not guarantee
>>>>>      old L4033 // sched_yield(2) will actually give up the CPU:
>>>>>      old L4034 //
>>>>>      old L4035 //   * Alone on this pariticular CPU, keeps running.
>>>>>      old L4036 //   * Before the introduction of "skip_buddy" with 
>>>>> "compat_yield" disabled
>>>>>      old L4037 //     (pre 2.6.39).
>>>>>      old L4038 //
>>>>>      old L4039 // So calling this with 0 is an alternative.
>>>>>      old L4040 //
>>>>>          I noticed this comment didn't get copied over to 
>>>>> os_posix.cpp.
>>>>>          Is the comment about an old enough Linux kernel that it is no
>>>>>          longer useful?
>>>>>
>>>>
>>>> At least to me it is not useful. Having it in the generic 
>>>> os_posix.cpp seems
>>>> miss-placed ? Let me know if you want it somewhere?
>>>
>>> Looks like the comment was added by this changeset:
>>>
>>> $ hg annot src/os/linux/vm/os_linux.cpp | grep 'certain versions of 
>>> Linux CFS scheduler'
>>>   5840: // Note: certain versions of Linux CFS scheduler (since 
>>> 2.6.23) do not guarantee
>>>
>>> $ hg log -r 5840
>>> changeset:   5840:5944dba4badc
>>> user:        dsimms
>>> date:        Fri Jan 24 09:28:47 2014 +0100
>>> summary:     8028280: ParkEvent leak when running modified runThese 
>>> which only loads classes
>>>
>>> $ hg diff -r 5839 -r 5840 src/os/linux/vm/os_linux.cpp
>>> diff -r d050fbf914d8 -r 5944dba4badc src/os/linux/vm/os_linux.cpp
>>> --- a/src/os/linux/vm/os_linux.cpp      Thu Jan 23 16:02:14 2014 -0500
>>> +++ b/src/os/linux/vm/os_linux.cpp      Fri Jan 24 09:28:47 2014 +0100
>>> @@ -3871,9 +3871,33 @@
>>>     }
>>>   }
>>>
>>> -int os::naked_sleep() {
>>> -  // %% make the sleep time an integer flag. for now use 1 millisec.
>>> -  return os::sleep(Thread::current(), 1, false);
>>> +//
>>> +// Short sleep, direct OS call.
>>> +//
>>> +// Note: certain versions of Linux CFS scheduler (since 2.6.23) do 
>>> not guarantee
>>> +// sched_yield(2) will actually give up the CPU:
>>> +//
>>> +//   * Alone on this pariticular CPU, keeps running.
>>> +//   * Before the introduction of "skip_buddy" with "compat_yield" 
>>> disabled
>>> +//     (pre 2.6.39).
>>> +//
>>> +// So calling this with 0 is an alternative.
>>> +//
>>> +void os::naked_short_sleep(jlong ms) {
>>> +  struct timespec req;
>>> +
>>> +  assert(ms < 1000, "Un-interruptable sleep, short time use only");
>>> +  req.tv_sec = 0;
>>> +  if (ms > 0) {
>>> +    req.tv_nsec = (ms % 1000) * 1000000;
>>> +  }
>>> +  else {
>>> +    req.tv_nsec = 1;
>>> +  }
>>> +
>>> +  nanosleep(&req, NULL);
>>> +
>>> +  return;
>>>   }
>>>
>>>   // Sleep forever; naked call to OS-specific sleep; use with CAUTION
>>>
>>>
>>> Since Mr Simms is local to you, I'll let you ping him when you
>>> get a chance. Don't let that hold up your fix. If Mr Simms wants
>>> the comment restored (somewhere), then we can do that with a
>>> different fix.
>>
>> I think Mr Simms is still on vacation. Regardless that comment seems 
>> better applied to:
>>
>> 4042 void os::naked_yield() {
>> 4043   sched_yield();
>> 4044 }
>>
>> with a reference to os::naked_sleep, than the other way around.
>>
>> Cheers,
>> David
>> -----
>>
>>>
>>> Dan
>>>
>>>
>>>>
>>>>>
>>>>> Thumbs up.
>>>>
>>>> Thanks Dan!
>>>>
>>>> /Robbin
>>>>
>>>>
>>>>>
>>>>> Dan
>>>>>
>>>>>
>>>>>>
>>>>>> Passes t1-3.
>>>>>>
>>>>>> Thanks, Robbin
>>>>>
>>>


More information about the hotspot-runtime-dev mailing list