FAILED: patch "[PATCH] s390/pci: Serialize device addition and removal" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-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 <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 774a1fa880bc949d88b5ddec9494a13be733dfa8
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025062020-cornhusk-copy-3cd0@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 774a1fa880bc949d88b5ddec9494a13be733dfa8 Mon Sep 17 00:00:00 2001
From: Niklas Schnelle <[email protected]>
Date: Thu, 22 May 2025 14:13:15 +0200
Subject: [PATCH] s390/pci: Serialize device addition and removal
Prior changes ensured that when zpci_release_device() is called and it removed the zdev from the zpci_list this instance can not be found via the zpci_list anymore even while allowing re-add of reserved devices. This only accounts for the overall lifetime and zpci_list addition and removal, it does not yet prevent concurrent add of a new instance for the same underlying device. Such concurrent add would subsequently cause issues such as attempted re-use of the same IOMMU sysfs directory and is generally undesired.
Introduce a new zpci_add_remove_lock mutex to serialize adding a new device with removal. Together this ensures that if a struct zpci_dev is not found in the zpci_list it was either already removed and torn down, or its removal and tear down is in progress with the zpci_add_remove_lock held.
arch/s390/pci/pci.c +7 -0
@@ -45,6 +45,7 @@/* list of all detected zpci devices */ static LIST_HEAD (zpci_list);static DEFINE_SPINLOCK (zpci_list_lock); +static DEFINE_MUTEX (zpci_add_remove_lock); static DECLARE_BITMAP(zpci_domain, ZPCI_DOMAIN_BITMAP_SIZE);static DEFINE_SPINLOCK (zpci_domain_lock);
@@ -74,7 +75,9 @@ void zpci_zdev_put(struct zpci_dev *zdev) {if (!zdev)return ; +mutex_lock (&zpci_add_remove_lock);kref_put_lock (&zdev->kref, zpci_release_device, &zpci_list_lock); +mutex_unlock (&zpci_add_remove_lock); }struct zpci_dev *get_zdev_by_fid (u32 fid)
@@ -844,6 +847,7 @@ int zpci_add_device(struct zpci_dev *zdev) {int rc; +mutex_lock (&zpci_add_remove_lock);zpci_dbg (1 ,"add fid:%x, fh:%x, c:%d\n" , zdev->fid, zdev->fh, zdev->state); rc =zpci_init_iommu (zdev);if (rc)
@@ -857,12 +861,14 @@ int zpci_add_device(struct zpci_dev *zdev)spin_lock (&zpci_list_lock);list_add_tail (&zdev->entry, &zpci_list);spin_unlock (&zpci_list_lock); +mutex_unlock (&zpci_add_remove_lock);return 0 ; error_destroy_iommu:zpci_destroy_iommu (zdev); error:zpci_dbg (0 ,"add fid:%x, rc:%d\n" , zdev->fid, rc); +mutex_unlock (&zpci_add_remove_lock);return rc; }
@@ -953,6 +959,7 @@ void zpci_release_device(struct kref *kref) { struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref); +lockdep_assert_held (&zpci_add_remove_lock);WARN_ON (zdev->state !=ZPCI_FN_STATE_RESERVED );/* * We already hold zpci_list_lock thanks to kref_put_lock().