From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Prateek Sood <prsood@codeaurora.org>,
Tejun Heo <tj@kernel.org>, Amit Pundir <amit.pundir@linaro.org>
Subject: [PATCH 4.14 29/45] cgroup/cpuset: remove circular dependency deadlock
Date: Thu, 11 Oct 2018 17:39:56 +0200 [thread overview]
Message-ID: <20181011152510.156825448@linuxfoundation.org> (raw)
In-Reply-To: <20181011152508.885515042@linuxfoundation.org>
4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prateek Sood <prsood@codeaurora.org>
commit aa24163b2ee5c92120e32e99b5a93143a0f4258e upstream.
Remove circular dependency deadlock in a scenario where hotplug of CPU is
being done while there is updation in cgroup and cpuset triggered from
userspace.
Process A => kthreadd => Process B => Process C => Process A
Process A
cpu_subsys_offline();
cpu_down();
_cpu_down();
percpu_down_write(&cpu_hotplug_lock); //held
cpuhp_invoke_callback();
workqueue_offline_cpu();
queue_work_on(); // unbind_work on system_highpri_wq
__queue_work();
insert_work();
wake_up_worker();
flush_work();
wait_for_completion();
worker_thread();
manage_workers();
create_worker();
kthread_create_on_node();
wake_up_process(kthreadd_task);
kthreadd
kthreadd();
kernel_thread();
do_fork();
copy_process();
percpu_down_read(&cgroup_threadgroup_rwsem);
__rwsem_down_read_failed_common(); //waiting
Process B
kernfs_fop_write();
cgroup_file_write();
cgroup_procs_write();
percpu_down_write(&cgroup_threadgroup_rwsem); //held
cgroup_attach_task();
cgroup_migrate();
cgroup_migrate_execute();
cpuset_can_attach();
mutex_lock(&cpuset_mutex); //waiting
Process C
kernfs_fop_write();
cgroup_file_write();
cpuset_write_resmask();
mutex_lock(&cpuset_mutex); //held
update_cpumask();
update_cpumasks_hier();
rebuild_sched_domains_locked();
get_online_cpus();
percpu_down_read(&cpu_hotplug_lock); //waiting
Eliminating deadlock by reversing the locking order for cpuset_mutex and
cpu_hotplug_lock.
Signed-off-by: Prateek Sood <prsood@codeaurora.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
kernel/cgroup/cpuset.c | 53 +++++++++++++++++++++++++++----------------------
1 file changed, 30 insertions(+), 23 deletions(-)
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -817,6 +817,18 @@ done:
return ndoms;
}
+static void cpuset_sched_change_begin(void)
+{
+ cpus_read_lock();
+ mutex_lock(&cpuset_mutex);
+}
+
+static void cpuset_sched_change_end(void)
+{
+ mutex_unlock(&cpuset_mutex);
+ cpus_read_unlock();
+}
+
/*
* Rebuild scheduler domains.
*
@@ -826,16 +838,14 @@ done:
* 'cpus' is removed, then call this routine to rebuild the
* scheduler's dynamic sched domains.
*
- * Call with cpuset_mutex held. Takes get_online_cpus().
*/
-static void rebuild_sched_domains_locked(void)
+static void rebuild_sched_domains_cpuslocked(void)
{
struct sched_domain_attr *attr;
cpumask_var_t *doms;
int ndoms;
lockdep_assert_held(&cpuset_mutex);
- get_online_cpus();
/*
* We have raced with CPU hotplug. Don't do anything to avoid
@@ -843,27 +853,25 @@ static void rebuild_sched_domains_locked
* Anyways, hotplug work item will rebuild sched domains.
*/
if (!cpumask_equal(top_cpuset.effective_cpus, cpu_active_mask))
- goto out;
+ return;
/* Generate domain masks and attrs */
ndoms = generate_sched_domains(&doms, &attr);
/* Have scheduler rebuild the domains */
partition_sched_domains(ndoms, doms, attr);
-out:
- put_online_cpus();
}
#else /* !CONFIG_SMP */
-static void rebuild_sched_domains_locked(void)
+static void rebuild_sched_domains_cpuslocked(void)
{
}
#endif /* CONFIG_SMP */
void rebuild_sched_domains(void)
{
- mutex_lock(&cpuset_mutex);
- rebuild_sched_domains_locked();
- mutex_unlock(&cpuset_mutex);
+ cpuset_sched_change_begin();
+ rebuild_sched_domains_cpuslocked();
+ cpuset_sched_change_end();
}
/**
@@ -949,7 +957,7 @@ static void update_cpumasks_hier(struct
rcu_read_unlock();
if (need_rebuild_sched_domains)
- rebuild_sched_domains_locked();
+ rebuild_sched_domains_cpuslocked();
}
/**
@@ -1281,7 +1289,7 @@ static int update_relax_domain_level(str
cs->relax_domain_level = val;
if (!cpumask_empty(cs->cpus_allowed) &&
is_sched_load_balance(cs))
- rebuild_sched_domains_locked();
+ rebuild_sched_domains_cpuslocked();
}
return 0;
@@ -1314,7 +1322,6 @@ static void update_tasks_flags(struct cp
*
* Call with cpuset_mutex held.
*/
-
static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs,
int turning_on)
{
@@ -1347,7 +1354,7 @@ static int update_flag(cpuset_flagbits_t
spin_unlock_irq(&callback_lock);
if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed)
- rebuild_sched_domains_locked();
+ rebuild_sched_domains_cpuslocked();
if (spread_flag_changed)
update_tasks_flags(cs);
@@ -1615,7 +1622,7 @@ static int cpuset_write_u64(struct cgrou
cpuset_filetype_t type = cft->private;
int retval = 0;
- mutex_lock(&cpuset_mutex);
+ cpuset_sched_change_begin();
if (!is_cpuset_online(cs)) {
retval = -ENODEV;
goto out_unlock;
@@ -1651,7 +1658,7 @@ static int cpuset_write_u64(struct cgrou
break;
}
out_unlock:
- mutex_unlock(&cpuset_mutex);
+ cpuset_sched_change_end();
return retval;
}
@@ -1662,7 +1669,7 @@ static int cpuset_write_s64(struct cgrou
cpuset_filetype_t type = cft->private;
int retval = -ENODEV;
- mutex_lock(&cpuset_mutex);
+ cpuset_sched_change_begin();
if (!is_cpuset_online(cs))
goto out_unlock;
@@ -1675,7 +1682,7 @@ static int cpuset_write_s64(struct cgrou
break;
}
out_unlock:
- mutex_unlock(&cpuset_mutex);
+ cpuset_sched_change_end();
return retval;
}
@@ -1714,7 +1721,7 @@ static ssize_t cpuset_write_resmask(stru
kernfs_break_active_protection(of->kn);
flush_work(&cpuset_hotplug_work);
- mutex_lock(&cpuset_mutex);
+ cpuset_sched_change_begin();
if (!is_cpuset_online(cs))
goto out_unlock;
@@ -1738,7 +1745,7 @@ static ssize_t cpuset_write_resmask(stru
free_trial_cpuset(trialcs);
out_unlock:
- mutex_unlock(&cpuset_mutex);
+ cpuset_sched_change_end();
kernfs_unbreak_active_protection(of->kn);
css_put(&cs->css);
flush_workqueue(cpuset_migrate_mm_wq);
@@ -2039,14 +2046,14 @@ out_unlock:
/*
* If the cpuset being removed has its flag 'sched_load_balance'
* enabled, then simulate turning sched_load_balance off, which
- * will call rebuild_sched_domains_locked().
+ * will call rebuild_sched_domains_cpuslocked().
*/
static void cpuset_css_offline(struct cgroup_subsys_state *css)
{
struct cpuset *cs = css_cs(css);
- mutex_lock(&cpuset_mutex);
+ cpuset_sched_change_begin();
if (is_sched_load_balance(cs))
update_flag(CS_SCHED_LOAD_BALANCE, cs, 0);
@@ -2054,7 +2061,7 @@ static void cpuset_css_offline(struct cg
cpuset_dec();
clear_bit(CS_ONLINE, &cs->flags);
- mutex_unlock(&cpuset_mutex);
+ cpuset_sched_change_end();
}
static void cpuset_css_free(struct cgroup_subsys_state *css)
next prev parent reply other threads:[~2018-10-11 15:46 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-11 15:39 [PATCH 4.14 00/45] 4.14.76-stable review Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 01/45] perf/core: Add sanity check to deal with pinned event failure Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 02/45] mm: migration: fix migration of huge PMD shared pages Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 03/45] mm, thp: fix mlocking THP page with migration enabled Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 04/45] mm/vmstat.c: skip NR_TLB_REMOTE_FLUSH* properly Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 05/45] KVM: x86: fix L1TFs MMIO GFN calculation Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 06/45] blk-mq: I/O and timer unplugs are inverted in blktrace Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 07/45] clocksource/drivers/timer-atmel-pit: Properly handle error cases Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 08/45] fbdev/omapfb: fix omapfb_memory_read infoleak Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 09/45] xen-netback: fix input validation in xenvif_set_hash_mapping() Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 10/45] drm/amdgpu: Fix vce work queue was not cancelled when suspend Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 11/45] drm/syncobj: Dont leak fences when WAIT_FOR_SUBMIT is set Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 12/45] x86/vdso: Fix asm constraints on vDSO syscall fallbacks Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 13/45] selftests/x86: Add clock_gettime() tests to test_vdso Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 14/45] x86/vdso: Only enable vDSO retpolines when enabled and supported Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 15/45] x86/vdso: Fix vDSO syscall fallback asm constraint regression Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 16/45] PCI: Reprogram bridge prefetch registers on resume Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 17/45] mac80211: fix setting IEEE80211_KEY_FLAG_RX_MGMT for AP mode keys Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 18/45] PM / core: Clear the direct_complete flag on errors Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 19/45] dm cache metadata: ignore hints array being too small during resize Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 20/45] dm cache: fix resize crash if user doesnt reload cache table Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 21/45] xhci: Add missing CAS workaround for Intel Sunrise Point xHCI Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 22/45] usb: xhci-mtk: resume USB3 roothub first Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 23/45] USB: serial: simple: add Motorola Tetra MTP6550 id Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 24/45] usb: cdc_acm: Do not leak URB buffers Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 25/45] tty: Drop tty->count on tty_reopen() failure Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 26/45] of: unittest: Disable interrupt node tests for old world MAC systems Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 27/45] perf annotate: Use asprintf when formatting objdump command line Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 28/45] perf tools: Fix python extension build for gcc 8 Greg Kroah-Hartman
2018-10-11 15:39 ` Greg Kroah-Hartman [this message]
2018-10-11 19:33 ` [PATCH 4.14 29/45] cgroup/cpuset: remove circular dependency deadlock Sudip Mukherjee
2018-10-12 11:05 ` Greg Kroah-Hartman
2018-10-16 18:46 ` Amit Pundir
2018-10-11 15:39 ` [PATCH 4.14 30/45] ath10k: fix use-after-free in ath10k_wmi_cmd_send_nowait Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 31/45] ath10k: fix kernel panic issue during pci probe Greg Kroah-Hartman
2018-10-11 15:39 ` [PATCH 4.14 32/45] nvme_fc: fix ctrl create failures racing with workq items Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 33/45] powerpc/lib/code-patching: refactor patch_instruction() Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 34/45] powerpc: Avoid code patching freed init sections Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 35/45] powerpc/lib: fix book3s/32 boot failure due to code patching Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 36/45] ARC: clone syscall to setp r25 as thread pointer Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 37/45] crypto: chelsio - Fix memory corruption in DMA Mapped buffers Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 38/45] perf utils: Move is_directory() to path.h Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 39/45] f2fs: fix invalid memory access Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 40/45] ucma: fix a use-after-free in ucma_resolve_ip() Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 41/45] ubifs: Check for name being NULL while mounting Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 42/45] rds: rds_ib_recv_alloc_cache() should call alloc_percpu_gfp() instead Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 43/45] virtio_balloon: fix deadlock on OOM Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 44/45] virtio_balloon: fix increment of vb->num_pfns in fill_balloon() Greg Kroah-Hartman
2018-10-11 15:40 ` [PATCH 4.14 45/45] ath10k: fix scan crash due to incorrect length calculation Greg Kroah-Hartman
2018-10-11 22:37 ` [PATCH 4.14 00/45] 4.14.76-stable review Shuah Khan
2018-10-12 4:27 ` Naresh Kamboju
2018-10-12 7:50 ` Jon Hunter
2018-10-12 7:50 ` Jon Hunter
2018-10-12 10:24 ` Greg Kroah-Hartman
2018-10-12 15:43 ` Guenter Roeck
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=20181011152510.156825448@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=amit.pundir@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=prsood@codeaurora.org \
--cc=stable@vger.kernel.org \
--cc=tj@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.