All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: gregkh@linuxfoundation.org
Cc: ego@linux.vnet.ibm.com, aneesh.kumar@linux.ibm.com,
	mpe@ellerman.id.au, stable@vger.kernel.org
Subject: Re: FAILED: patch "[PATCH] powerpc/pseries: Fix cpu_hotplug_lock acquisition in" failed to apply to 4.19-stable tree
Date: Tue, 8 Oct 2019 18:49:24 -0400	[thread overview]
Message-ID: <20191008224924.GH1396@sasha-vm> (raw)
In-Reply-To: <157051986923180@kroah.com>

On Tue, Oct 08, 2019 at 09:31:09AM +0200, gregkh@linuxfoundation.org wrote:
>
>The patch below does not apply to the 4.19-stable tree.
>If someone wants it applied there, or to any other stable or longterm
>tree, then please email the backport, including the original git commit
>id to <stable@vger.kernel.org>.
>
>thanks,
>
>greg k-h
>
>------------------ original commit in Linus's tree ------------------
>
>From c784be435d5dae28d3b03db31753dd7a18733f0c Mon Sep 17 00:00:00 2001
>From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
>Date: Wed, 15 May 2019 13:15:52 +0530
>Subject: [PATCH] powerpc/pseries: Fix cpu_hotplug_lock acquisition in
> resize_hpt()
>
>The calls to arch_add_memory()/arch_remove_memory() are always made
>with the read-side cpu_hotplug_lock acquired via memory_hotplug_begin().
>On pSeries, arch_add_memory()/arch_remove_memory() eventually call
>resize_hpt() which in turn calls stop_machine() which acquires the
>read-side cpu_hotplug_lock again, thereby resulting in the recursive
>acquisition of this lock.
>
>In the absence of CONFIG_PROVE_LOCKING, we hadn't observed a system
>lockup during a memory hotplug operation because cpus_read_lock() is a
>per-cpu rwsem read, which, in the fast-path (in the absence of the
>writer, which in our case is a CPU-hotplug operation) simply
>increments the read_count on the semaphore. Thus a recursive read in
>the fast-path doesn't cause any problems.
>
>However, we can hit this problem in practice if there is a concurrent
>CPU-Hotplug operation in progress which is waiting to acquire the
>write-side of the lock. This will cause the second recursive read to
>block until the writer finishes. While the writer is blocked since the
>first read holds the lock. Thus both the reader as well as the writers
>fail to make any progress thereby blocking both CPU-Hotplug as well as
>Memory Hotplug operations.
>
>Memory-Hotplug				CPU-Hotplug
>CPU 0					CPU 1
>------                                  ------
>
>1. down_read(cpu_hotplug_lock.rw_sem)
>   [memory_hotplug_begin]
>					2. down_write(cpu_hotplug_lock.rw_sem)
>					[cpu_up/cpu_down]
>3. down_read(cpu_hotplug_lock.rw_sem)
>   [stop_machine()]
>
>Lockdep complains as follows in these code-paths.
>
> swapper/0/1 is trying to acquire lock:
> (____ptrval____) (cpu_hotplug_lock.rw_sem){++++}, at: stop_machine+0x2c/0x60
>
>but task is already holding lock:
>(____ptrval____) (cpu_hotplug_lock.rw_sem){++++}, at: mem_hotplug_begin+0x20/0x50
>
> other info that might help us debug this:
>  Possible unsafe locking scenario:
>
>        CPU0
>        ----
>   lock(cpu_hotplug_lock.rw_sem);
>   lock(cpu_hotplug_lock.rw_sem);
>
>  *** DEADLOCK ***
>
>  May be due to missing lock nesting notation
>
> 3 locks held by swapper/0/1:
>  #0: (____ptrval____) (&dev->mutex){....}, at: __driver_attach+0x12c/0x1b0
>  #1: (____ptrval____) (cpu_hotplug_lock.rw_sem){++++}, at: mem_hotplug_begin+0x20/0x50
>  #2: (____ptrval____) (mem_hotplug_lock.rw_sem){++++}, at: percpu_down_write+0x54/0x1a0
>
>stack backtrace:
> CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.0.0-rc5-58373-gbc99402235f3-dirty #166
> Call Trace:
>   dump_stack+0xe8/0x164 (unreliable)
>   __lock_acquire+0x1110/0x1c70
>   lock_acquire+0x240/0x290
>   cpus_read_lock+0x64/0xf0
>   stop_machine+0x2c/0x60
>   pseries_lpar_resize_hpt+0x19c/0x2c0
>   resize_hpt_for_hotplug+0x70/0xd0
>   arch_add_memory+0x58/0xfc
>   devm_memremap_pages+0x5e8/0x8f0
>   pmem_attach_disk+0x764/0x830
>   nvdimm_bus_probe+0x118/0x240
>   really_probe+0x230/0x4b0
>   driver_probe_device+0x16c/0x1e0
>   __driver_attach+0x148/0x1b0
>   bus_for_each_dev+0x90/0x130
>   driver_attach+0x34/0x50
>   bus_add_driver+0x1a8/0x360
>   driver_register+0x108/0x170
>   __nd_driver_register+0xd0/0xf0
>   nd_pmem_driver_init+0x34/0x48
>   do_one_initcall+0x1e0/0x45c
>   kernel_init_freeable+0x540/0x64c
>   kernel_init+0x2c/0x160
>   ret_from_kernel_thread+0x5c/0x68
>
>Fix this issue by
>  1) Requiring all the calls to pseries_lpar_resize_hpt() be made
>     with cpu_hotplug_lock held.
>
>  2) In pseries_lpar_resize_hpt() invoke stop_machine_cpuslocked()
>     as a consequence of 1)
>
>  3) To satisfy 1), in hpt_order_set(), call mmu_hash_ops.resize_hpt()
>     with cpu_hotplug_lock held.
>
>Fixes: dbcf929c0062 ("powerpc/pseries: Add support for hash table resizing")
>Cc: stable@vger.kernel.org # v4.11+
>Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
>Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
>Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
>Link: https://lore.kernel.org/r/1557906352-29048-1-git-send-email-ego@linux.vnet.ibm.com

Just some conflicts with header includes. Fixed up and queued for 4.19
and 4.14.

-- 
Thanks,
Sasha

      reply	other threads:[~2019-10-08 22:49 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-08  7:31 FAILED: patch "[PATCH] powerpc/pseries: Fix cpu_hotplug_lock acquisition in" failed to apply to 4.19-stable tree gregkh
2019-10-08 22:49 ` Sasha Levin [this message]

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=20191008224924.GH1396@sasha-vm \
    --to=sashal@kernel.org \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=ego@linux.vnet.ibm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=mpe@ellerman.id.au \
    --cc=stable@vger.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.