All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>,
	Minchan Kim <minchan@kernel.org>, Nitin Gupta <ngupta@vflare.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Sasha Levin <sashal@kernel.org>,
	axboe@kernel.dk, linux-block@vger.kernel.org
Subject: [PATCH AUTOSEL 5.18 23/56] zram: do not lookup algorithm in backends table
Date: Sun, 14 Aug 2022 11:29:53 -0400	[thread overview]
Message-ID: <20220814153026.2377377-23-sashal@kernel.org> (raw)
In-Reply-To: <20220814153026.2377377-1-sashal@kernel.org>

From: Sergey Senozhatsky <senozhatsky@chromium.org>

[ Upstream commit dc89997264de565999a1cb55db3f295d3a8e457b ]

Always use crypto_has_comp() so that crypto can lookup module, call
usermodhelper to load the modules, wait for usermodhelper to finish and so
on.  Otherwise crypto will do all of these steps under CPU hot-plug lock
and this looks like too much stuff to handle under the CPU hot-plug lock.
Besides this can end up in a deadlock when usermodhelper triggers a code
path that attempts to lock the CPU hot-plug lock, that zram already holds.

An example of such deadlock:

- path A. zram grabs CPU hot-plug lock, execs /sbin/modprobe from crypto
  and waits for modprobe to finish

disksize_store
 zcomp_create
  __cpuhp_state_add_instance
   __cpuhp_state_add_instance_cpuslocked
    zcomp_cpu_up_prepare
     crypto_alloc_base
      crypto_alg_mod_lookup
       call_usermodehelper_exec
        wait_for_completion_killable
         do_wait_for_common
          schedule

- path B. async work kthread that brings in scsi device. It wants to
  register CPUHP states at some point, and it needs the CPU hot-plug
  lock for that, which is owned by zram.

async_run_entry_fn
 scsi_probe_and_add_lun
  scsi_mq_alloc_queue
   blk_mq_init_queue
    blk_mq_init_allocated_queue
     blk_mq_realloc_hw_ctxs
      __cpuhp_state_add_instance
       __cpuhp_state_add_instance_cpuslocked
        mutex_lock
         schedule

- path C. modprobe sleeps, waiting for all aync works to finish.

load_module
 do_init_module
  async_synchronize_full
   async_synchronize_cookie_domain
    schedule

[senozhatsky@chromium.org: add comment]
  Link: https://lkml.kernel.org/r/20220624060606.1014474-1-senozhatsky@chromium.org
Link: https://lkml.kernel.org/r/20220622023501.517125-1-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Nitin Gupta <ngupta@vflare.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/block/zram/zcomp.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c
index 052aa3f65514..0916de952e09 100644
--- a/drivers/block/zram/zcomp.c
+++ b/drivers/block/zram/zcomp.c
@@ -63,12 +63,6 @@ static int zcomp_strm_init(struct zcomp_strm *zstrm, struct zcomp *comp)
 
 bool zcomp_available_algorithm(const char *comp)
 {
-	int i;
-
-	i = sysfs_match_string(backends, comp);
-	if (i >= 0)
-		return true;
-
 	/*
 	 * Crypto does not ignore a trailing new line symbol,
 	 * so make sure you don't supply a string containing
@@ -217,6 +211,11 @@ struct zcomp *zcomp_create(const char *compress)
 	struct zcomp *comp;
 	int error;
 
+	/*
+	 * Crypto API will execute /sbin/modprobe if the compression module
+	 * is not loaded yet. We must do it here, otherwise we are about to
+	 * call /sbin/modprobe under CPU hot-plug lock.
+	 */
 	if (!zcomp_available_algorithm(compress))
 		return ERR_PTR(-EINVAL);
 
-- 
2.35.1


  parent reply	other threads:[~2022-08-14 15:36 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-14 15:29 [PATCH AUTOSEL 5.18 01/56] thunderbolt: Change downstream router's TMU rate in both TMU uni/bidir mode Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 02/56] HID: multitouch: new device class fix Lenovo X12 trackpad sticky Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 03/56] PCI: Add ACS quirk for Broadcom BCM5750x NICs Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 04/56] platform/chrome: cros_ec_proto: don't show MKBP version if unsupported Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 05/56] usb: cdns3 fix use-after-free at workaround 2 Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 06/56] usb: cdns3: fix random warning message when driver load Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 07/56] usb: gadget: uvc: calculate the number of request depending on framesize Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 08/56] usb: gadget: uvc: call uvc uvcg_warn on completed status instead of uvcg_info Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 09/56] PCI: aardvark: Fix reporting Slot capabilities on emulated bridge Sasha Levin
2022-08-14 15:29   ` Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 10/56] scsi: ufs: core: Add UFSHCD_QUIRK_BROKEN_64BIT_ADDRESS Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 11/56] scsi: ufs: core: Add UFSHCD_QUIRK_HIBERN_FASTAUTO Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 12/56] irqchip/tegra: Fix overflow implicit truncation warnings Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 13/56] drm/meson: " Sasha Levin
2022-08-14 15:29   ` Sasha Levin
2022-08-14 15:29   ` Sasha Levin
2022-08-14 15:29   ` Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 14/56] clk: ti: Stop using legacy clkctrl names for omap4 and 5 Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 15/56] scsi: ufs: ufs-mediatek: Fix the timing of configuring device regulators Sasha Levin
2022-08-14 15:29   ` Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 16/56] usb: host: ohci-ppc-of: Fix refcount leak bug Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 17/56] usb: renesas: " Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 18/56] scsi: iscsi: Fix HW conn removal use after free Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 19/56] usb: dwc2: gadget: remove D+ pull-up while no vbus with usb-role-switch Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 20/56] vboxguest: Do not use devm for irq Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 21/56] clk: qcom: ipq8074: dont disable gcc_sleep_clk_src Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 22/56] uacce: Handle parent device removal or parent driver module rmmod Sasha Levin
2022-08-14 15:29 ` Sasha Levin [this message]
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 24/56] clk: qcom: clk-alpha-pll: fix clk_trion_pll_configure description Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 25/56] scsi: lpfc: Prevent buffer overflow crashes in debugfs with malformed user input Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 26/56] scsi: lpfc: Fix possible memory leak when failing to issue CMF WQE Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 27/56] gadgetfs: ep_io - wait until IRQ finishes Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 28/56] coresight: etm4x: avoid build failure with unrolled loops Sasha Levin
2022-08-14 15:29   ` Sasha Levin
2022-08-14 15:29 ` [PATCH AUTOSEL 5.18 29/56] habanalabs: add terminating NULL to attrs arrays Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 30/56] habanalabs/gaudi: invoke device reset from one code block Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 31/56] habanalabs/gaudi: fix shift out of bounds Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 32/56] habanalabs/gaudi: mask constant value before cast Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 33/56] mmc: tmio: avoid glitches when resetting Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 34/56] scsi: ufs: ufs-exynos: Change ufs phy control sequence Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 35/56] pinctrl: intel: Check against matching data instead of ACPI companion Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 36/56] cxl: Fix a memory leak in an error handling path Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 37/56] PCI/ACPI: Guard ARM64-specific mcfg_quirks Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 38/56] um: add "noreboot" command line option for PANIC_TIMEOUT=-1 setups Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 39/56] dmaengine: dw-axi-dmac: do not print NULL LLI during error Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 40/56] dmaengine: dw-axi-dmac: ignore interrupt if no descriptor Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 41/56] ACPI: PPTT: Leave the table mapped for the runtime usage Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 42/56] RDMA/rxe: Limit the number of calls to each tasklet Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 43/56] csky/kprobe: reclaim insn_slot on kprobe unregistration Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 44/56] selftests/kprobe: Do not test for GRP/ without event failures Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 45/56] dmaengine: sprd: Cleanup in .remove() after pm_runtime_get_sync() failed Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 46/56] ARM: 9202/1: kasan: support CONFIG_KASAN_VMALLOC Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 47/56] ARM: 9203/1: kconfig: fix MODULE_PLTS for KASAN with KASAN_VMALLOC Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 48/56] openrisc: io: Define iounmap argument as volatile Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 49/56] phy: samsung: phy-exynos-pcie: sanitize init/power_on callbacks Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30   ` Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 50/56] md: Notify sysfs sync_completed in md_reap_sync_thread() Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 51/56] md/raid5: Make logic blocking check consistent with logic that blocks Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 52/56] nvmet-tcp: fix lockdep complaint on nvmet_tcp_wq flush during queue teardown Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 53/56] drivers:md:fix a potential use-after-free bug Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 54/56] ext4: avoid remove directory when directory is corrupted Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 55/56] ext4: block range must be validated before use in ext4_mb_clear_bb() Sasha Levin
2022-08-14 15:30 ` [PATCH AUTOSEL 5.18 56/56] ext4: avoid resizing to a partial cluster size Sasha Levin

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=20220814153026.2377377-23-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=axboe@kernel.dk \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=minchan@kernel.org \
    --cc=ngupta@vflare.org \
    --cc=senozhatsky@chromium.org \
    --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.