LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Max Krasnyanskiy <maxk@qualcomm.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>, Paul Jackson <pj@sgi.com>,
LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
Gregory Haskins <ghaskins@novell.com>
Subject: CPU isolation and workqueues [was Re: [CPUISOL] CPU isolation extensions]
Date: Mon, 04 Feb 2008 16:32:33 -0800 [thread overview]
Message-ID: <47A7AEA1.1090602@qualcomm.com> (raw)
In-Reply-To: <1201551730.28547.54.camel@lappy>
Peter Zijlstra wrote:
> On Mon, 2008-01-28 at 14:00 -0500, Steven Rostedt wrote:
>> On Mon, 28 Jan 2008, Max Krasnyanskiy wrote:
>>>>> [PATCH] [CPUISOL] Support for workqueue isolation
>>>> The thing about workqueues is that they should only be woken on a CPU if
>>>> something on that CPU accessed them. IOW, the workqueue on a CPU handles
>>>> work that was called by something on that CPU. Which means that
>>>> something that high prio task did triggered a workqueue to do some work.
>>>> But this can also be triggered by interrupts, so by keeping interrupts
>>>> off the CPU no workqueue should be activated.
>>> No no no. That's what I though too ;-). The problem is that things like NFS and friends
>>> expect _all_ their workqueue threads to report back when they do certain things like
>>> flushing buffers and stuff. The reason I added this is because my machines were getting
>>> stuck because CPU0 was waiting for CPU1 to run NFS work queue threads even though no IRQs
>>> or other things are running on it.
>> This sounds more like we should fix NFS than add this for all workqueues.
>> Again, we want workqueues to run on the behalf of whatever is running on
>> that CPU, including those tasks that are running on an isolcpu.
>
> agreed, by looking at my top output (and not the nfs code) it looks like
> it just spawns a configurable number of active kernel threads which are
> not cpu bound by in any way. I think just removing the isolated cpus
> from their runnable mask should take care of them.
Peter, Steven,
I think I convinced you guys last time but I did not have a convincing example. So here is some
more info on why workqueues need to be aware of isolated cpus.
Here is how a work queue gets flushed.
static int flush_cpu_workqueue(struct cpu_workqueue_struct *cwq)
{
int active;
if (cwq->thread == current) {
/*
* Probably keventd trying to flush its own queue. So simply run
* it by hand rather than deadlocking.
*/
run_workqueue(cwq);
active = 1;
} else {
struct wq_barrier barr;
active = 0;
spin_lock_irq(&cwq->lock);
if (!list_empty(&cwq->worklist) || cwq->current_work != NULL) {
insert_wq_barrier(cwq, &barr, 1);
active = 1;
}
spin_unlock_irq(&cwq->lock);
if (active)
wait_for_completion(&barr.done);
}
return active;
}
void fastcall flush_workqueue(struct workqueue_struct *wq)
{
const cpumask_t *cpu_map = wq_cpu_map(wq);
int cpu;
might_sleep();
lock_acquire(&wq->lockdep_map, 0, 0, 0, 2, _THIS_IP_);
lock_release(&wq->lockdep_map, 1, _THIS_IP_);
for_each_cpu_mask(cpu, *cpu_map)
flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, cpu));
}
In other words it schedules some work on each cpu and expects workqueue thread to run and
trigger the completion. This is what I meant that _all_ threads are expected to report
back even if there is nothing running on that CPU.
So my patch simply makes sure that isolated CPUs are ignored (if work queue isolation is enabled)
that work queue threads are not started on isolated in the CPUs that are isolated.
Max
next prev parent reply other threads:[~2008-02-05 0:33 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-28 4:09 [CPUISOL] CPU isolation extensions maxk
2008-01-28 4:09 ` [PATCH] [CPUISOL] Add config options for CPU isolation maxk
2008-01-28 4:09 ` [PATCH] [CPUISOL] Export CPU isolation bits maxk
2008-01-28 4:09 ` [PATCH] [CPUISOL] Do not route IRQs to the CPUs isolated at boot maxk
2008-01-28 4:09 ` [PATCH] [CPUISOL] Support for workqueue isolation maxk
2008-01-28 4:09 ` [PATCH] [CPUISOL] Isolated CPUs should be ignored by the "stop machine" maxk
2008-01-28 9:08 ` [CPUISOL] CPU isolation extensions Peter Zijlstra
2008-01-28 14:59 ` Paul Jackson
2008-01-28 16:34 ` Steven Rostedt
2008-01-28 16:44 ` Peter Zijlstra
2008-01-28 18:54 ` Max Krasnyanskiy
2008-01-28 18:46 ` Max Krasnyanskiy
2008-01-28 19:00 ` Steven Rostedt
2008-01-28 20:22 ` Peter Zijlstra
2008-01-28 21:42 ` Max Krasnyanskiy
2008-02-05 0:32 ` Max Krasnyanskiy [this message]
2008-01-28 18:37 ` Max Krasnyanskiy
2008-01-28 19:06 ` Paul Jackson
2008-01-28 21:47 ` Max Krasnyanskiy
2008-01-31 19:06 ` Integrating cpusets and cpu isolation [was Re: [CPUISOL] CPU isolation extensions] Max Krasnyanskiy
2008-02-02 6:16 ` Paul Jackson
2008-02-03 5:57 ` Max Krasnyansky
2008-02-03 7:53 ` Paul Jackson
2008-02-04 6:03 ` Max Krasnyansky
2008-02-04 10:54 ` Paul Jackson
2008-02-04 23:19 ` Max Krasnyanskiy
2008-02-05 2:46 ` Paul Jackson
2008-02-05 4:08 ` Max Krasnyansky
2008-01-28 18:32 ` [CPUISOL] CPU isolation extensions Max Krasnyanskiy
2008-01-28 19:10 ` Paul Jackson
2008-01-28 23:41 ` Daniel Walker
2008-01-29 0:12 ` Max Krasnyanskiy
2008-01-29 1:33 ` Daniel Walker
2008-02-04 6:53 ` Max Krasnyansky
2008-01-31 12:16 ` Mark Hounschell
2008-01-31 19:13 ` Max Krasnyanskiy
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=47A7AEA1.1090602@qualcomm.com \
--to=maxk@qualcomm.com \
--cc=a.p.zijlstra@chello.nl \
--cc=ghaskins@novell.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=pj@sgi.com \
--cc=rostedt@goodmis.org \
--subject='CPU isolation and workqueues [was Re: [CPUISOL] CPU isolation extensions]' \
/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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).