)]}'
{"id":"userspace-rcu~8445","triplet_id":"userspace-rcu~master~Id9c104c0bb77cc306f0b8fbf0b924bdda2aaaf4c","project":"userspace-rcu","branch":"master","topic":"fix-futex-race","hashtags":[],"change_id":"Id9c104c0bb77cc306f0b8fbf0b924bdda2aaaf4c","subject":"Fix: defer_rcu: futex wait: handle spurious futex wakeups","status":"MERGED","created":"2022-06-22 20:50:52.000000000","updated":"2022-06-27 14:30:14.000000000","submitted":"2022-06-27 14:30:14.000000000","submitter":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"total_comment_count":0,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"8441-fix-futex-race","meta_rev_id":"b86502456bab8595fc759c610a9d6341b4fb7635","_number":8445,"virtual_id_number":8445,"owner":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"actions":{},"labels":{"Code-Review":{"all":[{"value":0,"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]}],"values":{"-2":"This shall not be merged","-1":"I would prefer this is not merged as is"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me, approved"},"description":"","default_value":0,"optional":true},"Verified":{"all":[{"value":0,"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]}],"values":{"-2":"Failure","-1":"Not built"," 0":"No score","+1":"Unstable","+2":"Success"},"description":"CI Build results","default_value":0,"optional":true},"CI-Build":{"all":[{"value":0,"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]}],"values":{" 0":"No score","+1":"Trigger a CI build"},"description":"Trigger CI builds","default_value":0,"optional":true},"Smoke-Build-Lvl1":{"all":[{"value":0,"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]}],"values":{" 0":"No score","+1":"Trigger a level 1 smoke build"},"description":"Trigger Level 1 Smoke builds","default_value":0,"optional":true},"Smoke-Build-Lvl2":{"all":[{"value":0,"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]}],"values":{" 0":"No score","+1":"Trigger a level 2 smoke build"},"description":"Trigger Level 2 Smoke builds","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{},"pending_reviewers":{},"reviewer_updates":[],"messages":[{"id":"aa8abbb3ea3361d60e230832d147a2ea95efa7e8","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"date":"2022-06-22 20:50:52.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"4e7766039ff094520483cbcb097149687b955512","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"date":"2022-06-23 19:09:31.000000000","message":"Uploaded patch set 2.","accounts_in_message":[],"_revision_number":2},{"id":"b86502456bab8595fc759c610a9d6341b4fb7635","tag":"autogenerated:gerrit:merged","author":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"date":"2022-06-27 14:30:14.000000000","message":"Change has been successfully pushed.","accounts_in_message":[],"_revision_number":3}],"current_revision_number":3,"current_revision":"879a3e166178d16b2ffedc73899904d52285cfe8","revisions":{"0238ccf481c21f93929392012005b4ef7faf27ed":{"kind":"REWORK","_number":1,"created":"2022-06-22 20:50:52.000000000","uploader":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"ref":"refs/changes/45/8445/1","fetch":{"anonymous http":{"url":"https://review.lttng.org/userspace-rcu","ref":"refs/changes/45/8445/1","commands":{"Branch":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/1 \u0026\u0026 git checkout -b change-8445 FETCH_HEAD","Checkout":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.lttng.org/userspace-rcu refs/changes/45/8445/1","Reset To":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/1 \u0026\u0026 git reset --hard FETCH_HEAD"}}},"commit":{"parents":[{"commit":"ca23ed5ef62cd5373fe659b2e2b47c42c13f6e04","subject":"Fix: urcu-wait: futex wait: handle spurious futex wakeups","web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003dca23ed5ef62cd5373fe659b2e2b47c42c13f6e04"}]}],"author":{"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","date":"2022-06-22 20:46:50.000000000","tz":-240},"committer":{"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","date":"2022-06-22 20:46:50.000000000","tz":-240},"subject":"Fix: defer_rcu: futex wait: handle spurious futex wakeups","message":"Fix: defer_rcu: futex wait: handle spurious futex wakeups\n\nFrom futex(5):\n\n       FUTEX_WAIT\n              Returns 0 if the caller was woken up.  Note that a  wake-up  can\n              also  be caused by common futex usage patterns in unrelated code\n              that happened to have previously used the  futex  word\u0027s  memory\n              location  (e.g., typical futex-based implementations of Pthreads\n              mutexes can cause this under some conditions).  Therefore, call‐\n              ers should always conservatively assume that a return value of 0\n              can mean a spurious wake-up, and  use  the  futex  word\u0027s  value\n              (i.e.,  the user-space synchronization scheme) to decide whether\n              to continue to block or not.\n\nWe therefore need to validate whether the value differs from -1 in\nuser-space after the call to FUTEX_WAIT returns 0.\n\nSigned-off-by: Mathieu Desnoyers \u003cmathieu.desnoyers@efficios.com\u003e\nChange-Id: Id9c104c0bb77cc306f0b8fbf0b924bdda2aaaf4c\n","web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003d0238ccf481c21f93929392012005b4ef7faf27ed"}],"resolve_conflicts_web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003d0238ccf481c21f93929392012005b4ef7faf27ed"}]},"branch":"refs/heads/master"},"e14d4f49ec90af517b22f02c4e3068f20069a4b8":{"kind":"TRIVIAL_REBASE_WITH_MESSAGE_UPDATE","_number":2,"created":"2022-06-23 19:09:31.000000000","uploader":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"ref":"refs/changes/45/8445/2","fetch":{"anonymous http":{"url":"https://review.lttng.org/userspace-rcu","ref":"refs/changes/45/8445/2","commands":{"Branch":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/2 \u0026\u0026 git checkout -b change-8445 FETCH_HEAD","Checkout":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.lttng.org/userspace-rcu refs/changes/45/8445/2","Reset To":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/2 \u0026\u0026 git reset --hard FETCH_HEAD"}}},"commit":{"parents":[{"commit":"bf1852a23113c553fdc0992f3016e8652784142e","subject":"Fix: call_rcu: futex wait: handle spurious futex wakeups","web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003dbf1852a23113c553fdc0992f3016e8652784142e"}]}],"author":{"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","date":"2022-06-22 20:46:50.000000000","tz":-240},"committer":{"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","date":"2022-06-23 19:09:31.000000000","tz":-240},"subject":"Fix: defer_rcu: futex wait: handle spurious futex wakeups","message":"Fix: defer_rcu: futex wait: handle spurious futex wakeups\n\nObserved issue\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nThe urcu-defer wait_defer() implements a futex wait/wakeup scheme identical to\nthe workqueue code, which has an issue with spurious wakeups.\n\nA spurious wakeup on wait_defer can cause wait_defer to return with a\ndefer_thread_futex state of -1, which is unexpected. It would cause the\nfollowing loops in thr_defer() to decrement the defer_thread_futex to\nvalues below -1, thus actively using CPU as values will be decremented\nto very low negative values until it reaches 0 through underflow, or\nuntil callbacks are eventually queued. The state is restored to 0 when\ncallbacks are found, which restores the futex state to a correct state\nfor the following calls to wait_defer().\n\nThis issue will cause spurious unexpected high CPU use, but will not\nlead to data corruption.\n\nCause\n\u003d\u003d\u003d\u003d\u003d\n\nFrom futex(5):\n\n       FUTEX_WAIT\n              Returns 0 if the caller was woken up.  Note that a  wake-up  can\n              also  be caused by common futex usage patterns in unrelated code\n              that happened to have previously used the  futex  word\u0027s  memory\n              location  (e.g., typical futex-based implementations of Pthreads\n              mutexes can cause this under some conditions).  Therefore, call‐\n              ers should always conservatively assume that a return value of 0\n              can mean a spurious wake-up, and  use  the  futex  word\u0027s  value\n              (i.e.,  the user-space synchronization scheme) to decide whether\n              to continue to block or not.\n\nSolution\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nWe therefore need to validate whether the value differs from -1 in\nuser-space after the call to FUTEX_WAIT returns 0.\n\nKnown drawbacks\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nNone.\n\nSigned-off-by: Mathieu Desnoyers \u003cmathieu.desnoyers@efficios.com\u003e\nChange-Id: Id9c104c0bb77cc306f0b8fbf0b924bdda2aaaf4c\n","web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003de14d4f49ec90af517b22f02c4e3068f20069a4b8"}],"resolve_conflicts_web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003de14d4f49ec90af517b22f02c4e3068f20069a4b8"}]},"branch":"refs/heads/master"},"879a3e166178d16b2ffedc73899904d52285cfe8":{"kind":"NO_CHANGE","_number":3,"created":"2022-06-27 14:30:14.000000000","uploader":{"_account_id":1000009,"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","username":"compudj","avatars":[{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/7326b3e1d32b971a5e69d9730228c428.jpg?d\u003dretro\u0026r\u003dr\u0026s\u003d120","height":120}]},"ref":"refs/changes/45/8445/3","fetch":{"anonymous http":{"url":"https://review.lttng.org/userspace-rcu","ref":"refs/changes/45/8445/3","commands":{"Branch":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/3 \u0026\u0026 git checkout -b change-8445 FETCH_HEAD","Checkout":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.lttng.org/userspace-rcu refs/changes/45/8445/3","Reset To":"git fetch https://review.lttng.org/userspace-rcu refs/changes/45/8445/3 \u0026\u0026 git reset --hard FETCH_HEAD"}}},"commit":{"parents":[{"commit":"98d705dd32be11b3f134b5aed87f9c201c028c10","subject":"Fix: call_rcu: futex wait: handle spurious futex wakeups","web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003d98d705dd32be11b3f134b5aed87f9c201c028c10"}]}],"author":{"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","date":"2022-06-22 20:46:50.000000000","tz":-240},"committer":{"name":"Mathieu Desnoyers","email":"mathieu.desnoyers@efficios.com","date":"2022-06-27 14:30:13.000000000","tz":-240},"subject":"Fix: defer_rcu: futex wait: handle spurious futex wakeups","message":"Fix: defer_rcu: futex wait: handle spurious futex wakeups\n\nObserved issue\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nThe urcu-defer wait_defer() implements a futex wait/wakeup scheme identical to\nthe workqueue code, which has an issue with spurious wakeups.\n\nA spurious wakeup on wait_defer can cause wait_defer to return with a\ndefer_thread_futex state of -1, which is unexpected. It would cause the\nfollowing loops in thr_defer() to decrement the defer_thread_futex to\nvalues below -1, thus actively using CPU as values will be decremented\nto very low negative values until it reaches 0 through underflow, or\nuntil callbacks are eventually queued. The state is restored to 0 when\ncallbacks are found, which restores the futex state to a correct state\nfor the following calls to wait_defer().\n\nThis issue will cause spurious unexpected high CPU use, but will not\nlead to data corruption.\n\nCause\n\u003d\u003d\u003d\u003d\u003d\n\nFrom futex(5):\n\n       FUTEX_WAIT\n              Returns 0 if the caller was woken up.  Note that a  wake-up  can\n              also  be caused by common futex usage patterns in unrelated code\n              that happened to have previously used the  futex  word\u0027s  memory\n              location  (e.g., typical futex-based implementations of Pthreads\n              mutexes can cause this under some conditions).  Therefore, call‐\n              ers should always conservatively assume that a return value of 0\n              can mean a spurious wake-up, and  use  the  futex  word\u0027s  value\n              (i.e.,  the user-space synchronization scheme) to decide whether\n              to continue to block or not.\n\nSolution\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nWe therefore need to validate whether the value differs from -1 in\nuser-space after the call to FUTEX_WAIT returns 0.\n\nKnown drawbacks\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nNone.\n\nSigned-off-by: Mathieu Desnoyers \u003cmathieu.desnoyers@efficios.com\u003e\nChange-Id: Id9c104c0bb77cc306f0b8fbf0b924bdda2aaaf4c\n","web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003d879a3e166178d16b2ffedc73899904d52285cfe8"}],"resolve_conflicts_web_links":[{"name":"gitweb","tooltip":"Open in GitWeb","url":"/gitweb?p\u003duserspace-rcu.git;a\u003dcommit;h\u003d879a3e166178d16b2ffedc73899904d52285cfe8"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[],"submit_requirements":[]}
