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.