From nobody Mon Sep 28 09:58:45 2026 Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 11439387362 for ; Sun, 23 Aug 2026 18:35:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787510111; cv=none; b=jHN3RintJyyHxzZDKVNcnU+cwKR9Z4+4aMB+xq3Dc5nOQlrL/cT9GNT1wGaOK0K7r5lq9ifrgx7M676KCwUOieHw/EqYfYITEYO5Spe3EPSDnG4Ehq6Acucm/ifQImYAzj4YjY8gHAFivmRUlTmj0INWCxWO6hzOHjVR0EtQKAk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787510111; c=relaxed/simple; bh=plmNyVtYvBKCozMJTl5vmd3LXNlbTJ4OiKUbwMbkftw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SyEdBh5tBymZ+Idf0fURXkmwiLoyDUEeezPKvM13F0x0WQpgOeiunlY6OUy63fRRM0/WZlnSqTMO3Y/o+Uv5TVPyyeotDwD4fhHwqygb9jo9k5gcF25mCYzPfODN87MGWQEV0HY/7rJRRC82yIOt6RFL52A7zBVPXjkQMO6zVms= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=AjR634UX; arc=none smtp.client-ip=209.85.218.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AjR634UX" Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-c197e7e4e94so483354466b.2 for ; Sun, 23 Aug 2026 11:35:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787510106; x=1788114906; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=7VY7u501Z69wWM0BQwWCLe80wnzGYbVz/YdZ1cRrWkI=; b=AjR634UXdCO7QHQyfQy5mNWmLAuFZqA1pnEfDXj9whNgfHdDe9TnnXwqUy5tlk51aG YRVDGOwqmOCzhiTiFnKhbRFzEXAQH8erKWAXTSaeDvW6JhnHQ+2sXsIUBkI+0mtuZM0t E6pc0+vkIo6fW01mWy01Via8A9dbSSopYuQFmOcW2GZ4RR/mYeX+cK9lXsO5t3ulYfCk +ZLPrJ3s+qDvq0oml3Gs67inbj7WfS8Lz/vt8Zv0t4LIpmjjmxRNcvXHSbyITKf7kn/E TYs+TfIiMKzmZbpwNqz+VnNvi5fDhGErLaY8WDaI3UphtjY6Q0vlZB9fRNeB/+46iqpU pTjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787510106; x=1788114906; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=7VY7u501Z69wWM0BQwWCLe80wnzGYbVz/YdZ1cRrWkI=; b=fkPIWJWfRQ1sIlgMxxwvp/C2EWs5OWpFwrsS0La8ZsNjk9/Lg9/De6deoaxZ6LOCyT 56KXZgmaXhbqRK81PWA3ISUqyeZ1TyrwtmWAfsJRBwdiY+oS+gYTWhyGU/Ow2Qq5G+Vh jQxadFtfpPs/D3SLiivq+Yu9U/ps61EoLrzQPcFeQ4IF1+u0pyuPoOetvu/FfHyRXogD tKBDEJcQClFArNXXC70NVd1xsOOAbzwLcr5M+XEM7V6zHJ0dD70FrIAlvZdUpe8LCVfB mJ2KY5/w8JBjwBV+DvuN3Ld3+XaKV8DeYHrNDMmg95BTZs13chEpjKTswpcWzUlWmoaQ tZDg== X-Forwarded-Encrypted: i=1; AHgh+Rqo/h/jQt6C0Z7KVh4iZF7Qg7sWF9ntPDKhsNwvf3KMme3bpilW89f2FRsZcWAx3vFuxDsAGW8bfQixV70=@vger.kernel.org X-Gm-Message-State: AFuF++n3m/IaaVQBmCod4iytqL5KGgDtL9pbX3B9dlstoNWOZrZBqkRN C4BOj5P5dScXYwgtGomN46FYaAo1FdDQZPESKEPEfgrdwtpjBr11GQpD X-Gm-Gg: AR+sD10SMO5ei5EaaEA8I8OxI2ZhbjtirfN4MpTaUZ8DTvcic7EUfmAS/m8gctaPfHy V9SWY4eC2evSK6/dknw6v/b9JGjGTHjYHA6uP9qW5+dFhQ7nPEgwYfN8HgKpDRhirE8NoVfQqGy bvZmr5FaogcRAis1RnyKU6SqRf6qr7tN+jTf38UZhlfVCfrOQISGOsRGp6ipp7OcccdpE73LyTR a6wTjyJEUm1v7qjFdzQH2hg1/OLFmW7M7lTTFo+wHdD7C6vjWQ86WEeB72YEELgCFSbt+s20qdw W1jU3utApmJZeItIhWzRFHeWTPp/9opt4RcWLC5ihMXdcjryI7B4koppsAwD1Piw1MCHD31aVSg ERWMNbQg8x4A5NFRDNZyppUNKJ6OA6eUDV8IFFpQh+jdU8ww5o6FiV2sjRF711b2TcSydhAz9bY WybEUCYegnpSz1OBYTV/DiSR4Bz7dHP1uecvpvS0hWDzR0HsEW6LOWRx19aSSmd4nyKs/8PcrJ7 MQo94QzEq2HMfWOOmzIjMZZa/W8z8abM3crLohykqqhLQdseWieYAoS+UPR X-Received: by 2002:a17:907:d28:b0:c21:72b:dec0 with SMTP id a640c23a62f3a-c249238cd9cmr1502223166b.5.1787510106110; Sun, 23 Aug 2026 11:35:06 -0700 (PDT) Received: from 1c44f78ca37e.fritz.box (dynamic-002-214-002-133.2.214.pool.telefonica.de. [2.214.2.133]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24962bbea6sm805385066b.27.2026.08.23.11.35.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Aug 2026 11:35:05 -0700 (PDT) From: Abhin Parekadan Jose To: lukas@wunner.de, mst@redhat.com Cc: virtualization@lists.linux.dev, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, bhelgaas@google.com, kbusch@kernel.org, stefanha@redhat.com, parav@nvidia.com, axboe@kernel.dk, kees@kernel.org, ilpo.jarvinen@linux.intel.com, xueshuai@linux.alibaba.com, Abhin Parekadan Jose , Abhin Parekadan Jose Subject: [PATCH RFC 1/3] misc: add edu_srpoc surprise removal POC driver Date: Sun, 23 Aug 2026 18:34:53 +0000 Message-ID: <20260823183458.982699-2-abhinjoses@gmail.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20260823183458.982699-1-abhinjoses@gmail.com> References: <20260823183458.982699-1-abhinjoses@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Abhin Parekadan Jose A test driver for the QEMU edu device that reproduces the surprise removal hang described in MST's RFC v5 thread. - hacked in a reg to the edu device on qemu to raise a delayed irq - This driver writes to that reg in remove and waits for the irq to be handled. This simulate simulating del_gendisk() blocked in blk_mq_freeze_= queue_wait() Assisted-by: Claude:claude-sonnet-4-6 Signed-off-by: Abhin Parekadan Jose --- drivers/misc/Makefile | 1 + drivers/misc/edu_srpoc.c | 180 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 drivers/misc/edu_srpoc.c diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index fed47c7672b9..36da0539c215 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_AD525X_DPOT_I2C) +=3D ad525x_dpot-i2c.o obj-$(CONFIG_AD525X_DPOT_SPI) +=3D ad525x_dpot-spi.o obj-$(CONFIG_ATMEL_SSC) +=3D atmel-ssc.o obj-$(CONFIG_DUMMY_IRQ) +=3D dummy-irq.o +obj-y +=3D edu_srpoc.o obj-$(CONFIG_ICS932S401) +=3D ics932s401.o obj-$(CONFIG_LKDTM) +=3D lkdtm/ obj-$(CONFIG_TI_FPC202) +=3D ti_fpc202.o diff --git a/drivers/misc/edu_srpoc.c b/drivers/misc/edu_srpoc.c new file mode 100644 index 000000000000..ce2c254e3362 --- /dev/null +++ b/drivers/misc/edu_srpoc.c @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * edu_srpoc.c =E2=80=94 Surprise Removal POC driver for the QEMU edu devi= ce + * + * In remove(), schedules a delayed interrupt on the edu device and + * blocks waiting for it to complete. This simulates del_gendisk() + * blocked in blk_mq_freeze_queue_wait() on slow in-flight I/O. + * + * Surprise-remove the device during this window to reproduce the hang. + * + * edu BAR 0 registers used: + * 0x08 Factorial: write N to compute N! asynchronously + * 0x20 Status: write EDU_STATUS_IRQFACT to enable IRQ on completion + * 0x24 IRQ status: bit 0 =3D FACT_IRQ, bit 9 =3D DELAY_IRQ + * 0x30 Delayed IRQ: write N (ms). Hacked in this functionality(not ups= tream). + * 0x64 IRQ lower: write bitmask to ack + */ + +#include +#include +#include +#include +#include + +#define PCI_VENDOR_ID_EDU 0x1234 +#define PCI_DEVICE_ID_EDU 0x11e8 + +#define EDU_REG_FACT 0x08 +#define EDU_REG_STATUS 0x20 +#define EDU_REG_DELAYED_IRQ 0x30 +#define EDU_REG_IRQ_STATUS 0x24 +#define EDU_REG_IRQ_LOWER 0x64 + +#define EDU_STATUS_IRQFACT 0x80 +#define EDU_FACT_IRQ BIT(0) +#define EDU_DELAY_IRQ BIT(9) + +/* Large enough to take several seconds in the QEMU thread */ +#define EDU_SLOW_FACTORIAL 0xffffffff + +struct edu_dev { + struct pci_dev *pdev; + void __iomem *regs; + struct completion irq_done; +}; + +static irqreturn_t edu_irq_handler(int irq, void *data) +{ + struct edu_dev *edu =3D data; + u32 status; + + status =3D ioread32(edu->regs + EDU_REG_IRQ_STATUS); + if (!status) + return IRQ_NONE; + + iowrite32(status, edu->regs + EDU_REG_IRQ_LOWER); + + if (status & (EDU_FACT_IRQ | EDU_DELAY_IRQ)) + { + pr_info("complete(&edu->irq_done)\n"); + complete(&edu->irq_done); + } + + return IRQ_HANDLED; +} + +static void edu_disconnect(struct work_struct *work) +{ + struct pci_dev *pdev =3D container_of(work, struct pci_dev, + disconnect_work); + struct edu_dev *edu =3D pci_get_drvdata(pdev); + + dev_info(&pdev->dev, "edu_disconnect()\n"); + if (!pci_test_and_clear_disconnect_enable(pdev)) + return; + + if (!edu) + return; + + dev_info(&pdev->dev, "disconnect_work fired =E2=80=94 unblocking remove()= \n"); + complete(&edu->irq_done); +} + +static int edu_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct edu_dev *edu; + int err; + + dev_info(&pdev->dev, "edu_probe(): starting\n"); + + edu =3D devm_kzalloc(&pdev->dev, sizeof(*edu), GFP_KERNEL); + if (!edu) + return -ENOMEM; + + edu->pdev =3D pdev; + init_completion(&edu->irq_done); + + err =3D pci_enable_device(pdev); + if (err) + return err; + + err =3D pci_request_regions(pdev, "edu_srpoc"); + if (err) + goto err_disable; + + edu->regs =3D pci_iomap(pdev, 0, 0); + if (!edu->regs) { + err =3D -ENOMEM; + goto err_release; + } + + pci_set_master(pdev); + + err =3D pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI | PCI_IRQ_INTX); + if (err < 0) + goto err_iounmap; + + err =3D request_irq(pci_irq_vector(pdev, 0), edu_irq_handler, + IRQF_SHARED, "edu_srpoc", edu); + if (err) + goto err_free_vectors; + + pci_set_drvdata(pdev, edu); + + INIT_WORK(&pdev->disconnect_work, edu_disconnect); + pci_set_disconnect_work(pdev); + + dev_info(&pdev->dev, "edu_srpoc probed\n"); + return 0; + +err_free_vectors: + pci_free_irq_vectors(pdev); +err_iounmap: + pci_iounmap(pdev, edu->regs); +err_release: + pci_release_regions(pdev); +err_disable: + pci_disable_device(pdev); + return err; +} + +static void edu_remove(struct pci_dev *pdev) +{ + struct edu_dev *edu =3D pci_get_drvdata(pdev); + + dev_info(&pdev->dev, "remove(): starting factorial =E2=80=94 blocking for= IRQ\n"); + + iowrite32(EDU_STATUS_IRQFACT, edu->regs + EDU_REG_STATUS); + + iowrite32(600000, edu->regs + EDU_REG_DELAYED_IRQ); + + wait_for_completion(&edu->irq_done); + + dev_info(&pdev->dev, "remove(): unblocked, cleaning up\n"); + + pci_clear_disconnect_work(pdev); + free_irq(pci_irq_vector(pdev, 0), edu); + pci_free_irq_vectors(pdev); + pci_iounmap(pdev, edu->regs); + pci_release_regions(pdev); + pci_disable_device(pdev); +} + +static const struct pci_device_id edu_ids[] =3D { + { PCI_DEVICE(PCI_VENDOR_ID_EDU, PCI_DEVICE_ID_EDU) }, + { 0 } +}; +MODULE_DEVICE_TABLE(pci, edu_ids); + +static struct pci_driver edu_driver =3D { + .name =3D "edu_srpoc", + .id_table =3D edu_ids, + .probe =3D edu_probe, + .remove =3D edu_remove, +}; + +module_pci_driver(edu_driver); +MODULE_AUTHOR("Abhin Parekadan Jose"); +MODULE_DESCRIPTION("edu surprise removal POC driver"); +MODULE_LICENSE("GPL"); --=20 2.51.1 From nobody Mon Sep 28 09:58:45 2026 Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D28A38E119 for ; Sun, 23 Aug 2026 18:35:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787510111; cv=none; b=kVfrpAp200VFn06xhxPib42GZhGBZpJ+ACaT18KT8wLJnG+84aJP/Bu6zJk/EJN40DWjXW+R98maqcxgeUnoQeT2cIeg5q5Q+LuhI6ISnRjCDeIQqfogbwgat1cx+1p/9QtZNgs/hUOyoZI+IqrNUBaHB4o/+cxHpAPtBTKGlZw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787510111; c=relaxed/simple; bh=55H5C1Vn6kHJjAVaTokSUMg7w44PdxhSFTQ7W1a0KgA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DUJAvqpxHAVKqOBQH8C+wLq1MUeVJo2pSdik8cPzJcCsxjwO0RPhTZb97WXbsW4r7HP7I0cC444DWGlw379m1UyWyYUsDSmpaJR709ljgFaLO0buaETxMaTZVBfW3R3cvVw9KSyQj9HXspYGt+JQRAWPyHofQfGWsPofumoACX8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=snWFRohS; arc=none smtp.client-ip=209.85.218.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="snWFRohS" Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-c15ba3a2b4bso384561166b.1 for ; Sun, 23 Aug 2026 11:35:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787510108; x=1788114908; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=x1CGqHxj1gYluvAoTnY/OZsvt6mzgTLD3jk4hAmnXP4=; b=snWFRohScMQ6ftM/z0LHU+/YhQUBTXOmkEXTk7BtrHX6Gqhg5XY0+WPH2tQ7fkG5eG CRb1ifskkqlqdzQYGNeDGDPEhkLC6AADpccYIugSu3q8JqencwWQYGnUXe/Qthl1ErAM z5F88WDfuDKeGcOsf/lIkpntuB/fsJ1MoB01NsSXVOWY8nloznChHkggippdrtkwLBE1 9VXD0B2nBivkQsHt7lWXFNZzAg+V8ugwQdBPD5KZxz0fYizuTxwQl276u0i7jjXuXmi/ I7U2XFp7elRJhljizFEYW6xPvA2BC53oVBcxvWhEXkX6wmfXExtReK1BiZJGK0p3Aqzx X6dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787510108; x=1788114908; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=x1CGqHxj1gYluvAoTnY/OZsvt6mzgTLD3jk4hAmnXP4=; b=hgHfzuWD7dCfFOOMH8rTNP43bYDB+7G80OnPMPqNogBpMFUlQNWlOx9xz4G2n5VIzp 6L6eFkbPCfGbXdS9GyhPFJmNoL0BEEM5rQeHOGLy+hv+erbjDoR4Mfs+9b8l60eJTT82 HKCjcJmmztkuG7FijUuZthqg2/jbH/jYP3DKZ4Qvbof7VaSfsmyahEH9VJ+t4HmXFHjk 9oMuoxjDiX1p1i/+jqf+di0oppZbMoa7swvmU22Bv1VBpZ0UJzpTlVRJnQfJeBMcF8rH kOv7WNBUD4q4lfjcWzaQlwRtUDhJkhUWKgb/QhBSxrMMWyhwmWiTOLFvTpYz1Eka0Mk8 wpXg== X-Forwarded-Encrypted: i=1; AHgh+RrzPF78Ma9qOoPruQZLWBNPmKUgmzflndhLBAwEP2lsr5ksFz0y+PXXZw7IdH10TugPmBSw2HPdb13o2jY=@vger.kernel.org X-Gm-Message-State: AFuF++l2rHnVSLPP5dzzJMpu13BJcLHTKKJ4yHVDosEpHSx1e+NS9pXU G7TtAZYzQKYOgXCDvtxmzkRDcRpLZ5GiQNeqXrb8NBno4PtP8O2tQZTw X-Gm-Gg: AR+sD11z5wYqlqdjw9GArxViRFIzh7XFGjY2XzYxmdz8QZ2KpRIqIVzx3K85GkqiJmW u/FC+Y2qxP16DTlGP0H9oEmdQYRSpsWI8/IboPaP82ynHNT0AV0xyHoHMrraYFBUT2XP9bMtc+h 5LMlfauvpQ6ravbgnfO984P8IYUlrjbJdkuW7BXMcfIhNLIi8ZJQpBHIXQr5wEE27XqcNRBSzAU lhYYHd3lg3Rns+l5QnoVf4nrs+OubeQIZ85GEPju46jHAjmCtf5D76t2xllnaLETeGIbgX3UscG u02LBMJBMSuAeO856C99FQkH0RDyd99jBi/ssrGgDtFT5Fe4Sy0wq6QrZylORN4zr6+X+sD7P1G sNlUxP0tYOZ0gYMjLtQlt0RMDaoUOHsERlQO/Punyyv8KqmMSXRUoJOJE4PPqzL4FCG+M9slMU8 K5ecMTLqckzoH9mKhm8r0+5VvGsm5DoROJ/6KuO9b3cf2k8JgAE2miXvVWw+acK7efFuBfzgzCs Cj2Vf62xT/+yYoFG6+D/eAYoVDaUYxx5VXpRRhD6lYzUPNEMrQPClnIWtNOuTmWcQ== X-Received: by 2002:a17:906:b286:b0:c21:752f:c44e with SMTP id a640c23a62f3a-c246a67492cmr1878483566b.16.1787510108329; Sun, 23 Aug 2026 11:35:08 -0700 (PDT) Received: from 1c44f78ca37e.fritz.box (dynamic-002-214-002-133.2.214.pool.telefonica.de. [2.214.2.133]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24962bbea6sm805385066b.27.2026.08.23.11.35.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Aug 2026 11:35:07 -0700 (PDT) From: Abhin Parekadan Jose To: lukas@wunner.de, mst@redhat.com Cc: virtualization@lists.linux.dev, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, bhelgaas@google.com, kbusch@kernel.org, stefanha@redhat.com, parav@nvidia.com, axboe@kernel.dk, kees@kernel.org, ilpo.jarvinen@linux.intel.com, xueshuai@linux.alibaba.com, Abhin Parekadan Jose Subject: [PATCH RFC 2/3] pciehp: add disconnect_work work_struct Date: Sun, 23 Aug 2026 18:34:54 +0000 Message-ID: <20260823183458.982699-3-abhinjoses@gmail.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20260823183458.982699-1-abhinjoses@gmail.com> References: <20260823183458.982699-1-abhinjoses@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" - This work_struct is used to dispatch disconnect events directly from the = pciehp_isr, as we cannot wait in pciehp_isr Signed-off-by: Abhin Parekadan Jose --- drivers/pci/hotplug/pciehp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index debc79b0adfb..c8ceb9320e2e 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h @@ -116,6 +116,7 @@ struct controller { unsigned int ist_running; int request_result; wait_queue_head_t requester; + struct work_struct disconnect_work; }; =20 /** --=20 2.51.1 From nobody Mon Sep 28 09:58:45 2026 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9196E2C11E7 for ; Sun, 23 Aug 2026 18:35:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787510118; cv=none; b=ZL9EFwzqh6fu6jpHtztzWBvSj1MTHyUAHzHLJxetPflSknRGF45mJ/+YoE0Y6c1bvi+p4OV3FFrcrYn7xK59JDhteAVOYonCS5tp+cx9xzyr0PfK783ubIjhiJ+Vk6dh7rCC4gblmSX4F/zRqB6n90PkVXhrPd6/UCNiTbcIz+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787510118; c=relaxed/simple; bh=NvYRVXgFjcjQEUe8XA3TmxPUCrloiIqrGqm28dvgLK4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mrxApLVSNVeKfMNDIKbDe/24JDXFz02WOEGd32rMIsaojeft7zheamXEcKA8GX3npTfNd/amvQ5hGejCBT35Z4b83Yzi63mBQ27rZGz9ajkMH7dSu59hAk2e0wu8NxsrKz3PLBCS2niQw2YsSocCjnvjdwqFrGW3HggBt1RWwAo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=pULfaYNI; arc=none smtp.client-ip=209.85.218.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pULfaYNI" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-c160420289bso396182666b.0 for ; Sun, 23 Aug 2026 11:35:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787510111; x=1788114911; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=BIXCeWqSrCQg2g+vGMEBn3omtTu0U5s8PS5zUr5JWZM=; b=pULfaYNIW7PkBRfGya1Yx/xnnS+/gibW2vA9J12DdvOLZoMjZlrXpKSMReqRNEEBfh nKTrAAEe1Stda4W/Q9IlBtS85RWKU/rjOs0a6kcT1LGHwwLsZ/yrpP1qWdBdsj3ohxZF qfPUZlw2u+E6cKWkcAam813Z26aEXQ6QcjSE7sK6XX81SRIESZCcgFjx/WIa7quk5XTN yy3k3/CEtNilmDzz23/qiYoA/WpMkHqGVe7HIRi/ZqB4vNnz2Qw7o7uSDYzC+dH4M4P5 Gg0UN4PfB7GiSGnDV4Y+nHxbaI5u/v05RjkgYs69lcb2+yxU/FqVqkvbLcPlx3UiQTz/ FLtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787510111; x=1788114911; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=BIXCeWqSrCQg2g+vGMEBn3omtTu0U5s8PS5zUr5JWZM=; b=PxkWPj5TSL/fXpU9kHIRfeduzpwfW8SLdMUGKvCX8MEMnJ7CpykUAj4daiwjfsPjy5 JM8pQ2+EM8kEIoj620luGLchMwlMHuEH/szrH9PvT3md4qJx/NZ1aqPXm4VylwO94fy3 fyc69EnExsq9OU0slWWf0QOL0NGZ71Tvkky3cQN3Nr06d685qPqPIJKFBKkumR0MrfPc AhLRZJNmL3WZ69TWKLLrfsMXiezk4EkRUxEFaK+V0KMNze7u/pYx5OpUBM9ImaDWl1to xkckSosAnJ+b0kmsnOysp/VtqnSCXYrGsjqWntQgZ3QeDzPMl5AZq70HgCBO2a4wavRA jIlA== X-Forwarded-Encrypted: i=1; AHgh+Rq9fqRzxXRBAfp/ilp9bgUxKlY2GAYxL1+UaMk0eoOL9+jlIwQH5bEusVUCdiXi2oVfZnIv62RvbkSWbXs=@vger.kernel.org X-Gm-Message-State: AFuF++mtieOEIbPlgDxsE0CvTEzJZQ8lIKS4tJ47deTt8tFUxLDmaLSC aYdD9RISmXB7/rRGrRa2DzI8i+4VV7Q+6FSQTB1aTKtkdsszLbFcDWcQ X-Gm-Gg: AR+sD12cI1jOeSj+hugfUnACBpWxGO5VvLyrV+XWhyxK71OM7pggQd3BzcsvLS5hX+g M4dY39Y+PRCaX4N+fUMGbKyhZ8gSnpa2m7xhQAczwfUuUNG4GyRXL7ojjHDcBV4QjTmovEl+Zcu ZjJ+LvIL1ieuTJ78ZlqKD00DN3/VjTyx9FCidHU/jj4fFrKwDYft0Yk0Yl019W0d2+JPtg+Y1d/ AjoAdTGmldoWNgtJcbbg0Z5fyhiMjCFHQo9XD7hjZmtC7xSELRMLMb79cXQfzCu8SEfsHrzRaP9 jl+yBSZWvqRBzWWUrH/8fDRp6Ly0hiS026SkKsylL33+Hj7pUaM98EkVpyhjYVwQbnVWfg0KMc6 zAXwURhE4hkCEp6SEoZtvAMB6ex6hK8/CaG45op9Y7a3wDTTMgMIqZuKp1nYYqML6RrsHw3jaTQ /m7dJELya9koDd9Zp3+XU8YBqygR3VeXISZ1FjHEKmaojDdQV7EJFvMV6y70f9g4THw/1eTEh+p 1MZSM2H8CpPx3iljlpKVXV7+1JeR7mj2a0gnHiCFSpN1+jy0tT8v4Y= X-Received: by 2002:a17:906:5183:10b0:c16:84dc:9607 with SMTP id a640c23a62f3a-c246a704562mr1871998066b.19.1787510110478; Sun, 23 Aug 2026 11:35:10 -0700 (PDT) Received: from 1c44f78ca37e.fritz.box (dynamic-002-214-002-133.2.214.pool.telefonica.de. [2.214.2.133]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c24962bbea6sm805385066b.27.2026.08.23.11.35.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Aug 2026 11:35:10 -0700 (PDT) From: Abhin Parekadan Jose To: lukas@wunner.de, mst@redhat.com Cc: virtualization@lists.linux.dev, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, bhelgaas@google.com, kbusch@kernel.org, stefanha@redhat.com, parav@nvidia.com, axboe@kernel.dk, kees@kernel.org, ilpo.jarvinen@linux.intel.com, xueshuai@linux.alibaba.com, Abhin Parekadan Jose Subject: [PATCH RFC 3/3] pciehp_hpc: workaround to not wait in pciehp_isr on surprise removal Date: Sun, 23 Aug 2026 18:34:55 +0000 Message-ID: <20260823183458.982699-4-abhinjoses@gmail.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20260823183458.982699-1-abhinjoses@gmail.com> References: <20260823183458.982699-1-abhinjoses@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" - Add pciehp_disconnect_work() , this function is used using schedule_work = from pciehp_isr allowing us to not wait in pciehp_isr() - pciehp_disconnect_work() is scheduled only if the card is not detected (P= DS bit =3D 0). The PDS bit can be used to differentiate between a safe and surprise= removal. Signed-off-by: Abhin Parekadan Jose --- drivers/pci/hotplug/pciehp_hpc.c | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_= hpc.c index 4c62140a3cb4..69ed6b060e9d 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -620,6 +620,40 @@ static void pciehp_ignore_link_change(struct controlle= r *ctrl, up_read(&ctrl->reset_lock); } =20 +/* + * Workaround to not wait in the isr. + */ +static void pciehp_disconnect_work(struct work_struct *work) +{ + struct controller *ctrl =3D container_of(work, struct controller, + disconnect_work); + struct pci_dev *pdev =3D ctrl_dev(ctrl); + int events; + + events =3D atomic_read(&ctrl->pending_events); + + /* + * Ignore Link Down/Up events caused by Downstream Port Containment + * if recovery succeeded, or caused by Secondary Bus Reset, + * suspend to D3cold, firmware update, FPGA reconfiguration, etc. + */ + if ((events & (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC)) && + (pci_dpc_recovered(pdev) || pci_hp_spurious_link_change(pdev)) && + ctrl->state =3D=3D ON_STATE) { + // Ignore the link change events and return to normal operation. + // Could also wait here if needed. + return; + } + + struct pci_bus *bus =3D ctrl->pcie->port->subordinate; + + /* the card may have returned. */ + if (!bus || pciehp_card_present(ctrl) !=3D 0) + return; + + pci_walk_bus(bus, pci_dev_set_disconnected, NULL); +} + static irqreturn_t pciehp_isr(int irq, void *dev_id) { struct controller *ctrl =3D (struct controller *)dev_id; @@ -722,6 +756,17 @@ static irqreturn_t pciehp_isr(int irq, void *dev_id) =20 /* Save pending events for consumption by IRQ thread. */ atomic_or(events, &ctrl->pending_events); + + // presence change events + if (events & (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC)) { + // Get PDS bit to determine if card is present or not + int present =3D pciehp_card_present(ctrl); + if (!present) { // for sure the card is not present + schedule_work(&ctrl->disconnect_work); + // After this we are no longer in isr and can wait. + } + } + return IRQ_WAKE_THREAD; } =20 @@ -1036,6 +1081,7 @@ struct controller *pcie_init(struct pcie_device *dev) init_waitqueue_head(&ctrl->requester); init_waitqueue_head(&ctrl->queue); INIT_DELAYED_WORK(&ctrl->button_work, pciehp_queue_pushbutton_work); + INIT_WORK(&ctrl->disconnect_work, pciehp_disconnect_work); dbg_ctrl(ctrl); =20 down_read(&pci_bus_sem); @@ -1096,6 +1142,7 @@ struct controller *pcie_init(struct pcie_device *dev) void pciehp_release_ctrl(struct controller *ctrl) { cancel_delayed_work_sync(&ctrl->button_work); + cancel_work_sync(&ctrl->disconnect_work); kfree(ctrl); } =20 --=20 2.51.1