lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 27 Oct 2023 12:24:42 -0400
From:   Steven Rostedt <>
To:     Mathieu Desnoyers <>
Cc:     Linus Torvalds <>,
        Peter Zijlstra <>,
        LKML <>,
        Thomas Gleixner <>,
        Ankur Arora <>,,,,,,,,,,,,,,,,,,,,
        Joel Fernandes <>,
        Youssef Esmat <>,
        Vineeth Pillai <>,
        Suleiman Souhlal <>,
        Ingo Molnar <>,
        Daniel Bristot de Oliveira <>
Subject: Re: [POC][RFC][PATCH v2] sched: Extended Scheduler Time Slice

On Fri, 27 Oct 2023 12:09:56 -0400
Mathieu Desnoyers <> wrote:

> > I need to clear one bit while seeing if another bit is set. I could also
> > use subl, as that would also atomically clear the bit.  
> Ah ok, I did not get that you needed to test for a different bit than 
> the one you clear.

Yeah, maybe I'm not articulating the implementation as well.

  bit 0: Set by user space to tell the kernel it's in a critical section

  bit 1: Set by kernel that it gave user space extend time slice

Bit 1 will only be set by the kernel if bit 0 is set.

When entering a critical section, user space will set bit 0. When it leaves
the critical section, it needs to clear bit 0, but also needs to handle the
race condition from where it clears the bit and where the kernel could
preempt it and set bit 1. Thus it needs an atomic operation to clear bit 0
without affecting bit 1. Once bit 0 is cleared, it does not need to worry
about bit 1 being set after that as the kernel will only set bit 1 if it
sees that bit 0 was set. After user space clears bit 0, it must check bit 1
to see if it should now schedule. And it's also up to user space to clear
bit 1, but it can do that at any time with bit 0 cleared.

 extend() {
	cr_flags = 1;

 unextend() {
	cr_flags &= ~1;  /* Must be atomic */
	if (cr_flags & 2) {
		cr_flags = 0;  /* May not be necessary as it gets cleared by extend() */

Does that make more sense?

-- Steve

Powered by blists - more mailing lists