History

mmap locking API: add mmap_read_trylock_non_owner()

Add a couple APIs used by kernel/bpf/stackmap.c only: - mmap_read_trylock_non_owner() - mmap_read_unlock_non_owner() (may be called from a work queue). It's still not ideal that bpf/stackmap subverts the lock ownership in this way. Thanks to Peter Zijlstra for suggesting this API as the least-ugly way of addressing this in the short term.

Michel Lespinasse committed 6 years ago

Commit 0cc55a01 parent aaa2cc52 files · +19 −12Browse files

Showing the changes to kernel (1 of 2 files). Show all

Unified · Split

kernel/bpf/stackmap.c+5−12
@@ -33,7 +33,7 @@ struct bpf_stack_map { · 32 unmodified lines
3333 /* irq_work to run up_read() for build_id lookup in nmi context */
3434 struct stack_map_irq_work {
3535 struct irq_work irq_work;
36− struct rw_semaphore *sem;
36+ struct mm_struct *mm;
3737 };
3838
3939 static void do_up_read(struct irq_work *entry)
@@ -44,8 +44,7 @@ static void do_up_read(struct irq_work *entry) · 4 unmodified lines
4444 return;
4545
4646 work = container_of(entry, struct stack_map_irq_work, irq_work);
47− up_read_non_owner(work->sem);
48− work->sem = NULL;
47+ mmap_read_unlock_non_owner(work->mm);
4948 }
5049
5150 static DEFINE_PER_CPU(struct stack_map_irq_work, up_read_work);
@@ -317,7 +316,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, · 265 unmodified lines
317316 * with build_id.
318317 */
319318 if (!user || !current || !current->mm || irq_work_busy ||
320− mmap_read_trylock(current->mm) == 0) {
319+ !mmap_read_trylock_non_owner(current->mm)) {
321320 /* cannot access current->mm, fall back to ips */
322321 for (i = 0; i < trace_nr; i++) {
323322 id_offs[i].status = BPF_STACK_BUILD_ID_IP;
@@ -342,16 +341,10 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, · 18 unmodified lines
342341 }
343342
344343 if (!work) {
345− mmap_read_unlock(current->mm);
344+ mmap_read_unlock_non_owner(current->mm);
346345 } else {
347− work->sem = &current->mm->mmap_sem;
346+ work->mm = current->mm;
348347 irq_work_queue(&work->irq_work);
349− /*
350− * The irq_work will release the mmap_sem with
351− * up_read_non_owner(). The rwsem_release() is called
352− * here to release the lock from lockdep's perspective.
353− */
354− rwsem_release(&current->mm->mmap_sem.dep_map, _RET_IP_);
355348 }
356349 }
357350

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t