From: Peter Zijlstra <peterz@infradead.org>
To: Matthew Wilcox <willy@infradead.org>
Cc: "Paul E. McKenney" <paulmck@kernel.org>,
Andrii Nakryiko <andrii.nakryiko@gmail.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
mingo@kernel.org, andrii@kernel.org,
linux-kernel@vger.kernel.org, rostedt@goodmis.org,
oleg@redhat.com, jolsa@kernel.org, clm@meta.com,
bpf <bpf@vger.kernel.org>
Subject: Re: [PATCH 00/10] perf/uprobe: Optimize uprobes
Date: Wed, 10 Jul 2024 11:40:13 +0200 [thread overview]
Message-ID: <20240710094013.GF28838@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <20240710091631.GT27299@noisy.programming.kicks-ass.net>
On Wed, Jul 10, 2024 at 11:16:31AM +0200, Peter Zijlstra wrote:
> If it were an actual sequence count, I could make it work, but sadly,
> not. Also, vma_end_write() seems to be missing :-( If anything it could
> be used to lockdep annotate the thing.
>
> Mooo.. I need to stare more at this to see if perhaps it can be made to
> work, but so far, no joy :/
See, this is what I want, except I can't close the race against VMA
modification because of that crazy locking scheme :/
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -2146,11 +2146,58 @@ static int is_trap_at_addr(struct mm_str
return is_trap_insn(&opcode);
}
-static struct uprobe *find_active_uprobe(unsigned long bp_vaddr, int *is_swbp)
+#ifndef CONFIG_PER_VMA_LOCK
+static struct uprobe *__find_active_uprobe(unsigned long bp_vaddr)
+{
+ return NULL;
+}
+#else
+static struct uprobe *__find_active_uprobe(unsigned long bp_vaddr)
{
struct mm_struct *mm = current->mm;
struct uprobe *uprobe = NULL;
struct vm_area_struct *vma;
+ MA_STATE(mas, &mm->mm_mt, bp_vaddr, bp_vaddr);
+
+ guard(rcu)();
+
+again:
+ vma = mas_walk(&mas);
+ if (!vma)
+ return NULL;
+
+ /* vma_write_start() -- in progress */
+ if (READ_ONCE(vma->vm_lock_seq) == READ_ONCE(vma->vm_mm->mm_lock_seq))
+ return NULL;
+
+ /*
+ * Completely broken, because of the crazy vma locking scheme you
+ * cannot avoid the per-vma rwlock and doing so means you're racy
+ * against modifications.
+ *
+ * A simple actual seqcount would'be been cheaper and more usefull.
+ */
+
+ if (!valid_vma(vma, false))
+ return NULL;
+
+ struct inode = file_inode(vma->vm_file);
+ loff_t offset = vaddr_to_offset(vma, bp_vaddr);
+
+ // XXX: if (vma_seq_retry(...)) goto again;
+
+ return find_uprobe(inode, offset);
+}
+#endif
+
+static struct uprobe *find_active_uprobe(unsigned long bp_vaddr, int *is_swbp)
+{
+ struct uprobe *uprobe = __find_active_uprobe(bp_vaddr)
+ struct mm_struct *mm = current->mm;
+ struct vm_area_struct *vma;
+
+ if (uprobe)
+ return uprobe;
mmap_read_lock(mm);
vma = vma_lookup(mm, bp_vaddr);
next prev parent reply other threads:[~2024-07-10 9:40 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20240708091241.544262971@infradead.org>
[not found] ` <20240709075651.122204f1358f9f78d1e64b62@kernel.org>
2024-07-09 0:25 ` [PATCH 00/10] perf/uprobe: Optimize uprobes Andrii Nakryiko
2024-07-09 9:01 ` Peter Zijlstra
2024-07-09 14:11 ` Paul E. McKenney
2024-07-09 14:29 ` Peter Zijlstra
2024-07-09 14:36 ` Paul E. McKenney
2024-07-09 15:31 ` Peter Zijlstra
2024-07-09 15:56 ` Paul E. McKenney
2024-07-09 16:10 ` Matthew Wilcox
2024-07-09 16:30 ` Matthew Wilcox
2024-07-09 16:57 ` Paul E. McKenney
2024-07-10 9:16 ` Peter Zijlstra
2024-07-10 9:40 ` Peter Zijlstra [this message]
2024-07-22 19:09 ` Suren Baghdasaryan
2024-07-27 0:20 ` Andrii Nakryiko
2024-07-27 1:29 ` Suren Baghdasaryan
2024-07-27 3:45 ` Matthew Wilcox
2024-07-30 3:18 ` Andrii Nakryiko
2024-07-30 13:10 ` Peter Zijlstra
2024-07-30 18:10 ` Suren Baghdasaryan
2024-08-03 5:47 ` Andrii Nakryiko
2024-08-03 8:53 ` Peter Zijlstra
2024-08-04 23:22 ` Andrii Nakryiko
2024-08-06 4:08 ` Andrii Nakryiko
2024-08-06 14:50 ` Suren Baghdasaryan
2024-08-06 17:40 ` Andrii Nakryiko
2024-08-06 17:44 ` Suren Baghdasaryan
2024-08-07 1:36 ` Suren Baghdasaryan
2024-08-07 5:13 ` Suren Baghdasaryan
2024-08-07 17:49 ` Andrii Nakryiko
2024-08-07 18:04 ` Suren Baghdasaryan
2024-08-07 18:30 ` Andrii Nakryiko
2024-08-07 18:33 ` Suren Baghdasaryan
2024-08-08 0:47 ` Andrii Nakryiko
2024-07-30 13:46 ` Peter Zijlstra
2024-07-30 18:16 ` Suren Baghdasaryan
2024-07-09 16:42 ` Andrii Nakryiko
2024-07-09 9:03 ` Peter Zijlstra
2024-07-09 10:01 ` Jiri Olsa
2024-07-09 10:16 ` Peter Zijlstra
2024-07-09 22:10 ` Masami Hiramatsu
2024-07-10 10:10 ` Peter Zijlstra
2024-07-10 14:56 ` Masami Hiramatsu
2024-07-10 18:40 ` Andrii Nakryiko
2024-07-11 8:51 ` Peter Zijlstra
2024-07-11 15:17 ` Masami Hiramatsu
2024-07-11 15:22 ` Peter Zijlstra
2024-07-11 17:47 ` Steven Rostedt
2024-07-11 23:59 ` Masami Hiramatsu
2024-07-10 0:55 ` Masami Hiramatsu
2024-07-09 21:47 ` Andrii Nakryiko
2024-07-10 10:12 ` Peter Zijlstra
2024-07-10 12:34 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240710094013.GF28838@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=andrii.nakryiko@gmail.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=clm@meta.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=paulmck@kernel.org \
--cc=rostedt@goodmis.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox