Skip to content

Commit aaecdaf

Browse files
torvaldsrostedt
authored andcommitted
tracing/user_events: Remove RCU lock while pinning pages
pin_user_pages_remote() can reschedule which means we cannot hold any RCU lock while using it. Now that enablers are not exposed out to the tracing register callbacks during fork(), there is clearly no need to require the RCU lock as event_mutex is enough to protect changes. Remove unneeded RCU usages when pinning pages and walking enablers with event_mutex held. Cleanup a misleading "safe" list walk that is not needed. During fork() duplication, remove unneeded RCU list add, since the list is not exposed yet. Link: https://lkml.kernel.org/r/20230519230741.669-3-beaub@linux.microsoft.com Link: https://lore.kernel.org/linux-trace-kernel/CAHk-=wiiBfT4zNS29jA0XEsy8EmbqTH1hAPdRJCDAJMD8Gxt5A@mail.gmail.com/ Fixes: 7235759 ("tracing/user_events: Use remote writes for event enablement") Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> [ change log written by Beau Belgrave ] Signed-off-by: Beau Belgrave <beaub@linux.microsoft.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent 3e0fea0 commit aaecdaf

1 file changed

Lines changed: 7 additions & 6 deletions

File tree

kernel/trace/trace_events_user.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -439,9 +439,8 @@ static bool user_event_enabler_exists(struct user_event_mm *mm,
439439
unsigned long uaddr, unsigned char bit)
440440
{
441441
struct user_event_enabler *enabler;
442-
struct user_event_enabler *next;
443442

444-
list_for_each_entry_safe(enabler, next, &mm->enablers, link) {
443+
list_for_each_entry(enabler, &mm->enablers, link) {
445444
if (enabler->addr == uaddr && ENABLE_BIT(enabler) == bit)
446445
return true;
447446
}
@@ -456,19 +455,19 @@ static void user_event_enabler_update(struct user_event *user)
456455
struct user_event_mm *next;
457456
int attempt;
458457

458+
lockdep_assert_held(&event_mutex);
459+
459460
while (mm) {
460461
next = mm->next;
461462
mmap_read_lock(mm->mm);
462-
rcu_read_lock();
463463

464-
list_for_each_entry_rcu(enabler, &mm->enablers, link) {
464+
list_for_each_entry(enabler, &mm->enablers, link) {
465465
if (enabler->event == user) {
466466
attempt = 0;
467467
user_event_enabler_write(mm, enabler, true, &attempt);
468468
}
469469
}
470470

471-
rcu_read_unlock();
472471
mmap_read_unlock(mm->mm);
473472
user_event_mm_put(mm);
474473
mm = next;
@@ -496,7 +495,9 @@ static bool user_event_enabler_dup(struct user_event_enabler *orig,
496495
enabler->values = orig->values & ENABLE_VAL_DUP_MASK;
497496

498497
refcount_inc(&enabler->event->refcnt);
499-
list_add_rcu(&enabler->link, &mm->enablers);
498+
499+
/* Enablers not exposed yet, RCU not required */
500+
list_add(&enabler->link, &mm->enablers);
500501

501502
return true;
502503
}

0 commit comments

Comments
 (0)