(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.-- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html