From: Arnd Bergmann <arnd@arndb.de>
To: cbe-oss-dev@ozlabs.org, maynardj@us.ibm.com
Cc: linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
oprofile-list@lists.sourceforge.net
Subject: Re: [Cbe-oss-dev] [RFC, PATCH 3/4] Add support to OProfile for profiling Cell BE SPUs -- update
Date: Tue, 30 Jan 2007 05:24:32 +0100 [thread overview]
Message-ID: <200701300524.32556.arnd@arndb.de> (raw)
In-Reply-To: <45BE4F78.6080705@us.ibm.com>
On Monday 29 January 2007 20:48, Maynard Johnson wrote:
> Subject: Enable SPU switch notification to detect currently active SPU tasks.
>
> From: Maynard Johnson <maynardj@us.ibm.com>
>
> This patch adds to the capability of spu_switch_event_register so that the
> caller is also notified of currently active SPU tasks. It also exports
> spu_switch_event_register and spu_switch_event_unregister.
>
> Signed-off-by: Maynard Johnson <mpjohn@us.ibm.com>
I looked through it again, and think I found a serious bug, but that
should be easy enough to solve:
> +static void notify_spus_active(void)
> +{
> + int node;
> + /* Wake up the active spu_contexts. When the awakened processes
> + * sees their notify_active flag is set, they will call
> + * spu_switch_notify();
> + */
> + for (node = 0; node < MAX_NUMNODES; node++) {
> + struct spu *spu;
> + mutex_lock(&spu_prio->active_mutex[node]);
> + list_for_each_entry(spu, &spu_prio->active_list[node], list) {
> + struct spu_context *ctx = spu->ctx;
[side note]
There is a small whitespace breakage in here, please make sure you always
use tabs for indenting, not space characters.
[/side note]
> @@ -45,9 +45,10 @@
> u64 pte_fault;
>
> *stat = ctx->ops->status_read(ctx);
> - if (ctx->state != SPU_STATE_RUNNABLE)
> - return 1;
> +
> spu = ctx->spu;
> + if (ctx->state != SPU_STATE_RUNNABLE || spu->notify_active)
> + return 1;
> pte_fault = spu->dsisr &
> (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
> return (!(*stat & 0x1) || pte_fault || spu->class_0_pending) ? 1 : 0;
> @@ -305,6 +306,7 @@
> u32 *npc, u32 *event)
> {
> int ret;
> + struct spu * spu;
> u32 status;
>
> if (down_interruptible(&ctx->run_sema))
> @@ -318,8 +320,16 @@
>
> do {
> ret = spufs_wait(ctx->stop_wq, spu_stopped(ctx, &status));
> + spu = ctx->spu;
> if (unlikely(ret))
> break;
> + if (unlikely(spu->notify_active)) {
> + spu->notify_active = 0;
> + if (!(status & SPU_STATUS_STOPPED_BY_STOP)) {
> + spu_switch_notify(spu, ctx);
> + continue;
> + }
> + }
This is before spu_reacquire_runnable, so in case the spu got
preempted at the same time when oprofile was enabled, ctx->spu
is NULL, and you can't load the notify_active flag from it.
On solution would be to move the notify_active flag from ctx->spu
into ctx itself, but maybe there are other ways to solve this.
Thanks,
Arnd <><
WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de>
To: cbe-oss-dev@ozlabs.org, maynardj@us.ibm.com
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org,
oprofile-list@lists.sourceforge.net
Subject: Re: [Cbe-oss-dev] [RFC, PATCH 3/4] Add support to OProfile for profiling Cell BE SPUs -- update
Date: Tue, 30 Jan 2007 05:24:32 +0100 [thread overview]
Message-ID: <200701300524.32556.arnd@arndb.de> (raw)
In-Reply-To: <45BE4F78.6080705@us.ibm.com>
On Monday 29 January 2007 20:48, Maynard Johnson wrote:
> Subject: Enable SPU switch notification to detect currently active SPU tasks.
>
> From: Maynard Johnson <maynardj@us.ibm.com>
>
> This patch adds to the capability of spu_switch_event_register so that the
> caller is also notified of currently active SPU tasks. It also exports
> spu_switch_event_register and spu_switch_event_unregister.
>
> Signed-off-by: Maynard Johnson <mpjohn@us.ibm.com>
I looked through it again, and think I found a serious bug, but that
should be easy enough to solve:
> +static void notify_spus_active(void)
> +{
> + int node;
> + /* Wake up the active spu_contexts. When the awakened processes
> + * sees their notify_active flag is set, they will call
> + * spu_switch_notify();
> + */
> + for (node = 0; node < MAX_NUMNODES; node++) {
> + struct spu *spu;
> + mutex_lock(&spu_prio->active_mutex[node]);
> + list_for_each_entry(spu, &spu_prio->active_list[node], list) {
> + struct spu_context *ctx = spu->ctx;
[side note]
There is a small whitespace breakage in here, please make sure you always
use tabs for indenting, not space characters.
[/side note]
> @@ -45,9 +45,10 @@
> u64 pte_fault;
>
> *stat = ctx->ops->status_read(ctx);
> - if (ctx->state != SPU_STATE_RUNNABLE)
> - return 1;
> +
> spu = ctx->spu;
> + if (ctx->state != SPU_STATE_RUNNABLE || spu->notify_active)
> + return 1;
> pte_fault = spu->dsisr &
> (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
> return (!(*stat & 0x1) || pte_fault || spu->class_0_pending) ? 1 : 0;
> @@ -305,6 +306,7 @@
> u32 *npc, u32 *event)
> {
> int ret;
> + struct spu * spu;
> u32 status;
>
> if (down_interruptible(&ctx->run_sema))
> @@ -318,8 +320,16 @@
>
> do {
> ret = spufs_wait(ctx->stop_wq, spu_stopped(ctx, &status));
> + spu = ctx->spu;
> if (unlikely(ret))
> break;
> + if (unlikely(spu->notify_active)) {
> + spu->notify_active = 0;
> + if (!(status & SPU_STATUS_STOPPED_BY_STOP)) {
> + spu_switch_notify(spu, ctx);
> + continue;
> + }
> + }
This is before spu_reacquire_runnable, so in case the spu got
preempted at the same time when oprofile was enabled, ctx->spu
is NULL, and you can't load the notify_active flag from it.
On solution would be to move the notify_active flag from ctx->spu
into ctx itself, but maybe there are other ways to solve this.
Thanks,
Arnd <><
next prev parent reply other threads:[~2007-01-30 4:24 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-29 19:45 [RFC, PATCH 0/4] Add support to OProfile for profiling Cell BE SPUs -- update Maynard Johnson
2007-01-29 19:46 ` [RFC, PATCH 1/4] " Maynard Johnson
2007-01-30 4:07 ` [Cbe-oss-dev] " Arnd Bergmann
2007-01-30 4:07 ` Arnd Bergmann
2007-01-30 10:39 ` Christoph Hellwig
2007-01-30 10:39 ` Christoph Hellwig
2007-01-30 22:49 ` Carl Love
2007-01-30 22:49 ` Carl Love
2007-01-30 22:57 ` Benjamin Herrenschmidt
2007-01-30 22:57 ` Benjamin Herrenschmidt
2007-01-31 8:47 ` Christoph Hellwig
2007-01-31 8:47 ` Christoph Hellwig
2007-01-30 22:59 ` Benjamin Herrenschmidt
2007-01-30 22:59 ` Benjamin Herrenschmidt
2007-01-29 19:47 ` [RFC, PATCH 2/4] " Maynard Johnson
2007-01-30 4:08 ` [Cbe-oss-dev] " Arnd Bergmann
2007-01-30 4:08 ` Arnd Bergmann
2007-01-30 23:51 ` Carl Love
2007-01-30 23:51 ` Carl Love
2007-01-29 19:48 ` [RFC, PATCH 3/4] " Maynard Johnson
2007-01-30 4:24 ` Arnd Bergmann [this message]
2007-01-30 4:24 ` [Cbe-oss-dev] " Arnd Bergmann
2007-01-30 15:31 ` Maynard Johnson
2007-01-30 15:31 ` Maynard Johnson
2007-01-31 0:35 ` Arnd Bergmann
2007-01-31 0:35 ` Arnd Bergmann
2007-01-29 19:48 ` [RFC, PATCH 4/4] " Maynard Johnson
2007-01-30 7:39 ` [Cbe-oss-dev] " Arnd Bergmann
2007-01-30 7:53 ` Benjamin Herrenschmidt
2007-01-30 7:53 ` Benjamin Herrenschmidt
2007-01-30 10:41 ` Christoph Hellwig
2007-01-30 10:41 ` Christoph Hellwig
2007-01-30 23:09 ` Maynard Johnson
2007-01-30 23:09 ` Maynard Johnson
2007-01-30 21:41 ` Maynard Johnson
2007-01-30 21:41 ` Maynard Johnson
2007-01-30 22:54 ` Maynard Johnson
2007-01-30 22:54 ` Maynard Johnson
2007-01-30 23:34 ` Benjamin Herrenschmidt
2007-01-30 23:34 ` Benjamin Herrenschmidt
2007-01-31 0:29 ` Maynard Johnson
2007-01-31 0:29 ` Maynard Johnson
2007-01-31 6:52 ` Arnd Bergmann
2007-01-31 6:52 ` Arnd Bergmann
2007-02-02 16:47 ` Maynard Johnson
2007-02-02 16:47 ` Maynard Johnson
2007-02-03 7:40 ` Arnd Bergmann
2007-02-03 7:40 ` Arnd Bergmann
2007-02-03 20:03 ` Maynard Johnson
2007-02-03 20:03 ` Maynard Johnson
2007-02-04 2:42 ` Arnd Bergmann
2007-02-04 2:42 ` Arnd Bergmann
2007-02-04 17:11 ` Maynard Johnson
2007-02-04 17:11 ` Maynard Johnson
2007-01-30 23:31 ` Carl Love
2007-01-30 23:31 ` Carl Love
2007-01-31 1:25 ` Christian Krafft
2007-01-31 1:25 ` Christian Krafft
2007-01-31 6:06 ` Arnd Bergmann
2007-01-31 6:06 ` Arnd Bergmann
2007-01-31 5:57 ` Arnd Bergmann
2007-01-31 5:57 ` Arnd Bergmann
2007-02-02 19:27 ` Maynard Johnson
2007-02-02 19:27 ` Maynard Johnson
2007-02-03 23:49 ` Maynard Johnson
2007-02-03 23:49 ` Maynard Johnson
2007-02-04 2:52 ` Arnd Bergmann
2007-02-04 2:52 ` Arnd Bergmann
2007-02-04 17:33 ` Maynard Johnson
2007-02-04 17:33 ` Maynard Johnson
2007-01-31 9:24 ` Milton Miller
2007-01-31 15:42 ` Arnd Bergmann
2007-02-01 18:56 ` Milton Miller
2007-02-02 0:54 ` Arnd Bergmann
2007-01-30 8:37 ` [RFC, PATCH 0/4] " Arnd Bergmann
2007-01-30 8:37 ` Arnd Bergmann
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=200701300524.32556.arnd@arndb.de \
--to=arnd@arndb.de \
--cc=cbe-oss-dev@ozlabs.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=maynardj@us.ibm.com \
--cc=oprofile-list@lists.sourceforge.net \
/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.