From: Oleg Nesterov <oleg@redhat.com>
To: Vince Weaver <vincent.weaver@maine.edu>
Cc: linux-kernel@vger.kernel.org,
"Peter Zijlstra" <a.p.zijlstra@chello.nl>,
"Paul Mackerras" <paulus@samba.org>,
"Ingo Molnar" <mingo@redhat.com>,
"Arnaldo Carvalho de Melo" <acme@ghostprotocols.net>,
trinity@vger.kernel.org,
"Frédéric Weisbecker" <fweisbec@gmail.com>
Subject: Re: WARN_ONCE in arch/x86/kernel/hw_breakpoint.c
Date: Tue, 28 May 2013 19:00:48 +0200 [thread overview]
Message-ID: <20130528170048.GA26906@redhat.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1305201206480.29892@vincent-weaver-1.um.maine.edu>
Well. I am not familiar with this code, and when I tried to read it
I feel I will be never able to understand it ;)
On 05/20, Vince Weaver wrote:
>
> on 3.10-rc1 with the trinity fuzzer patched to exercise the
> perf_event_open() syscall I am triggering this WARN_ONCE:
>
> [ 75.864822] ------------[ cut here ]------------
> [ 75.864830] WARNING: at arch/x86/kernel/hw_breakpoint.c:121 arch_install_hw_breakpoint+0x5b/0xcb()
...
> [ 75.864916] [<ffffffff81006fff>] ? arch_install_hw_breakpoint+0x5b/0xcb
> [ 75.864919] [<ffffffff810ab5a1>] ? event_sched_in+0x68/0x11c
I am wondering if we should check attr->pinned before WARN_ONCE...
But it seems that hw_breakpoint.c is buggy anyway.
Suppose that attr.task != NULL and event->cpu = -1.
__reserve_bp_slot() tries to calculate slots.pinned and calls
fetch_bp_busy_slots().
In this case fetch_bp_busy_slots() does
for_each_online_cpu(cpu)
...
nr += task_bp_pinned(cpu, bp, type);
And task_bp_pinned() (in particular) checks cpu == event->cpu,
this will be never true.
IOW, it seems that __reserve_bp_slot(task, cpu => -1) always
succeeds because task_bp_pinned() returns 0 and thus we can
create more than HWP_NUM breakpoints. Much more ;)
As for _create, I guess we probably need something like
--- x/kernel/events/hw_breakpoint.c
+++ x/kernel/events/hw_breakpoint.c
@@ -156,7 +156,7 @@ fetch_bp_busy_slots(struct bp_busy_slots
if (!tsk)
nr += max_task_bp_pinned(cpu, type);
else
- nr += task_bp_pinned(cpu, bp, type);
+ nr += task_bp_pinned(-1, bp, type);
if (nr > slots->pinned)
slots->pinned = nr;
But I simply can't understand toggle_bp_task_slot()->task_bp_pinned().
Oleg.
next prev parent reply other threads:[~2013-05-28 17:00 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-20 16:19 WARN_ONCE in arch/x86/kernel/hw_breakpoint.c Vince Weaver
2013-05-28 17:00 ` Oleg Nesterov [this message]
2013-05-28 17:28 ` Oleg Nesterov
2013-05-28 18:47 ` Oleg Nesterov
2013-05-29 16:32 ` [MAYBEPATCH] : " Oleg Nesterov
2013-06-01 18:20 ` [PATCH 0/2]: " Oleg Nesterov
2013-06-01 18:21 ` [PATCH 1/2] hw_breakpoint: Fix cpu check in task_bp_pinned(cpu) Oleg Nesterov
2013-06-13 14:20 ` Frederic Weisbecker
2013-06-01 18:21 ` [PATCH 2/2] hw_breakpoint: Use cpu_possible_mask in {reserve,release}_bp_slot() Oleg Nesterov
2013-06-15 12:46 ` Frederic Weisbecker
2013-06-01 19:45 ` [PATCH 0/3] hw_breakpoint: cleanups Oleg Nesterov
2013-06-01 19:45 ` [PATCH 1/3] hw_breakpoint: Simplify list/idx mess in toggle_bp_slot() paths Oleg Nesterov
2013-06-15 12:59 ` Frederic Weisbecker
2013-06-01 19:46 ` [PATCH 2/3] hw_breakpoint: Simplify the "weight" usage " Oleg Nesterov
2013-06-15 13:14 ` Frederic Weisbecker
2013-06-01 19:46 ` [PATCH 3/3] hw_breakpoint: Introduce cpumask_of_bp() Oleg Nesterov
2013-06-15 13:29 ` Frederic Weisbecker
2013-06-13 14:01 ` [PATCH 0/3] hw_breakpoint: cleanups Frederic Weisbecker
2013-06-13 15:15 ` Oleg Nesterov
2013-06-13 15:24 ` Frederic Weisbecker
2013-06-02 19:49 ` [PATCH 0/2] hw_breakpoint: more cleanups Oleg Nesterov
2013-06-02 19:50 ` [PATCH 1/2] hw_breakpoint: Simplify *register_wide_hw_breakpoint() Oleg Nesterov
2013-06-18 0:12 ` Frederic Weisbecker
2013-06-02 19:50 ` [PATCH 2/2] hw_breakpoint: Introduce "struct bp_cpuinfo" Oleg Nesterov
2013-06-18 12:37 ` Frederic Weisbecker
2013-06-18 14:42 ` Oleg Nesterov
2013-06-18 17:01 ` Frederic Weisbecker
2013-06-19 15:54 ` Oleg Nesterov
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=20130528170048.GA26906@redhat.com \
--to=oleg@redhat.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=fweisbec@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=paulus@samba.org \
--cc=trinity@vger.kernel.org \
--cc=vincent.weaver@maine.edu \
/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.