From: Oleg Nesterov <oleg@redhat.com>
To: Andi Kleen <andi@firstfloor.org>, Ingo Molnar <mingo@elte.hu>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH] Add a text_poke syscall
Date: Thu, 21 Nov 2013 19:26:23 +0100 [thread overview]
Message-ID: <20131121182623.GA21535@redhat.com> (raw)
In-Reply-To: <1384820855-27790-1-git-send-email-andi@firstfloor.org>
Can't really comment this patch, just a couple of nits...
On 11/18, Andi Kleen wrote:
>
> int poke_int3_handler(struct pt_regs *regs)
> {
> @@ -602,6 +619,14 @@ int poke_int3_handler(struct pt_regs *regs)
> if (likely(!bp_patching_in_progress))
> return 0;
>
> + if (user_mode_vm(regs) &&
> + bp_target_mm &&
> + current->mm == bp_target_mm &&
> + regs->ip == (unsigned long)bp_int3_addr) {
> + regs->ip = (unsigned long) bp_int3_handler;
> + return 1;
> + }
> +
> if (user_mode_vm(regs) || regs->ip != (unsigned long)bp_int3_addr)
> return 0;
This looks a bit confusing, afaics we can avoid the duplications:
// also handles bp_target_mm == NULL case
if (user_mode_vm(regs) && current->mm != bp_target_mm)
return 0;
if (regs->ip != (unsigned long)bp_int3_addr)
return 0;
/* set up the specified breakpoint handler */
regs->ip = (unsigned long) bp_int3_handler;
return 1;
> +SYSCALL_DEFINE5(text_poke,
> + __user void *, addr,
> + const void *, opcode,
> + size_t, len,
> + void *, handler,
> + int, timeout)
> +{
> + struct page *pages[2];
> + char insn[MAX_INSN_LEN];
> + int err, npages;
> +
> + if ((unsigned long)len > MAX_INSN_LEN || len == 0)
> + return -EINVAL;
> + /* For future extension */
> + if (timeout != 0)
> + return -EINVAL;
> + if (copy_from_user(insn, opcode, len))
> + return -EFAULT;
> + pages[1] = NULL;
> + npages = ((unsigned long)addr & PAGE_MASK) ==
> + (((unsigned long)addr + len) & PAGE_MASK) ? 1 : 2;
> + err = get_user_pages_fast((unsigned long)addr, npages, 1, pages);
> + if (err < 0)
> + return err;
> + err = 0;
> + mutex_lock(&text_mutex);
> + bp_target_mm = current->mm;
> + bp_int3_addr = (u8 *)addr + 1;
> + __text_poke_bp(pages,
> + (unsigned long)addr & ~PAGE_MASK,
> + insn, len, handler);
This doesn't look right if npages == 2 but get_user_pages_fast() returns 1.
__text_poke() checks pages[1] != NULL, but in this case it assumes
that memcpy(vaddr, opcode, len) should fit into the 1st page.
Ingo, Andi, I do not think that it is good idea to implement this
via ptrace. If nothing else, you need to fork the tracer which can
do PTRACE_POKETEXT.
Please note that PTRACE_TRACEME does not mean self-tracing, it means
that current->real_parent becomes the tracer (imho this interface
should die but we obviously can't kill it). So I don't see how it
can help. And you can't ptrace yourself of a sub-thread, this is
explicitly forbidden by ptrace_attach()->same_thread_group() check.
And ptrace can't really help with CLONE_VM tasks.
Or I misunderstood the suggestion.
Oleg.
next prev parent reply other threads:[~2013-11-21 18:25 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-19 0:27 [PATCH] Add a text_poke syscall Andi Kleen
2013-11-19 2:32 ` Andy Lutomirski
2013-11-19 20:16 ` Andi Kleen
2013-11-21 10:02 ` Jiri Kosina
2013-11-19 5:23 ` H. Peter Anvin
2013-11-19 18:49 ` Andi Kleen
2013-11-20 16:42 ` H. Peter Anvin
2013-11-20 17:25 ` Andi Kleen
2013-11-20 18:30 ` H. Peter Anvin
2013-11-20 21:00 ` H. Peter Anvin
2013-11-21 12:49 ` Steven Rostedt
2013-11-19 6:49 ` Ingo Molnar
2013-11-19 19:10 ` Andi Kleen
2013-11-21 13:07 ` Steven Rostedt
2013-11-22 3:26 ` Andi Kleen
2013-11-21 18:26 ` Oleg Nesterov [this message]
2013-11-22 3:29 ` Andi Kleen
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=20131121182623.GA21535@redhat.com \
--to=oleg@redhat.com \
--cc=ak@linux.intel.com \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=x86@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.