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

Robbin Ehn robbin.ehn at oracle.com
Tue Dec 18 09:19:05 UTC 2018


Hi David,

Fixed, sending new version to your other mail.

Thanks, Robbin

On 11/30/18 5:39 AM, David Holmes wrote:
> 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