18
18
#define CREATE_TRACE_POINTS
19
19
#include <trace/events/rseq.h>
20
20
21
- #define RSEQ_CS_PREEMPT_MIGRATE_FLAGS (RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE | \
22
- RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT)
21
+ #define RSEQ_CS_NO_RESTART_FLAGS (RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT | \
22
+ RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL | \
23
+ RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE)
23
24
24
25
/*
25
26
*
@@ -175,23 +176,15 @@ static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
175
176
u32 flags , event_mask ;
176
177
int ret ;
177
178
179
+ if (WARN_ON_ONCE (cs_flags & RSEQ_CS_NO_RESTART_FLAGS ))
180
+ return - EINVAL ;
181
+
178
182
/* Get thread flags. */
179
183
ret = get_user (flags , & t -> rseq -> flags );
180
184
if (ret )
181
185
return ret ;
182
186
183
- /* Take critical section flags into account. */
184
- flags |= cs_flags ;
185
-
186
- /*
187
- * Restart on signal can only be inhibited when restart on
188
- * preempt and restart on migrate are inhibited too. Otherwise,
189
- * a preempted signal handler could fail to restart the prior
190
- * execution context on sigreturn.
191
- */
192
- if (unlikely ((flags & RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL ) &&
193
- (flags & RSEQ_CS_PREEMPT_MIGRATE_FLAGS ) !=
194
- RSEQ_CS_PREEMPT_MIGRATE_FLAGS ))
187
+ if (WARN_ON_ONCE (flags & RSEQ_CS_NO_RESTART_FLAGS ))
195
188
return - EINVAL ;
196
189
197
190
/*
@@ -203,7 +196,7 @@ static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
203
196
t -> rseq_event_mask = 0 ;
204
197
preempt_enable ();
205
198
206
- return !!( event_mask & ~ flags ) ;
199
+ return !!event_mask ;
207
200
}
208
201
209
202
static int clear_rseq_cs (struct task_struct * t )
0 commit comments