Thread (2 messages) 2 messages, 2 authors, 2017-11-14

Re: [RFC PATCH v11 for 4.15 01/24] Restartable sequences system call

From: Ben Maurer <hidden>
Date: 2017-11-14 20:53:39
Also in: lkml

(apologies for the duplicate email, the previous one bounced as it was accidentally using HTML formatting)

If I understand correctly this is run on every context switch so we probably want to make it really fast
+static int rseq_need_restart(struct task_struct *t, uint32_t cs_flags)
+{
+       bool need_restart = false;
+       uint32_t flags;
+
+       /* Get thread flags. */
+       if (__get_user(flags, &t->rseq->flags))
+               return -EFAULT;
+
+       /* Take into account critical section flags. */
+       flags |= cs_flags;
+
+       /*
+        * Restart on signal can only be inhibited when restart on
+        * preempt and restart on migrate are inhibited too. Otherwise,
+        * a preempted signal handler could fail to restart the prior
+        * execution context on sigreturn.
+        */
+       if (flags & RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL) {
+               if (!(flags & RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE))
+                       return -EINVAL;
+               if (!(flags & RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT))
+                       return -EINVAL;
+       }
How does this error even get to userspace? Is it worth doing this switch on every execution?

+       if (t->rseq_migrate
+                       && !(flags & RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE))
+               need_restart = true;
+       else if (t->rseq_preempt
+                       && !(flags & RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT))
+               need_restart = true;
+       else if (t->rseq_signal
+                       && !(flags & RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL))
+               need_restart = true;
This could potentially be sped up by having the rseq_* fields in t use a single bitmask with the same bit offsets as RSEQ_CS_FLAG_NO_* then using bit operations to check the appropriate overlap.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help