Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.0/patches/2197364/?format=api
{ "id": 2197364, "url": "http://patchwork.ozlabs.org/api/1.0/patches/2197364/?format=api", "project": { "id": 28, "url": "http://patchwork.ozlabs.org/api/1.0/projects/28/?format=api", "name": "Linux PCI development", "link_name": "linux-pci", "list_id": "linux-pci.vger.kernel.org", "list_email": "linux-pci@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<20260217182257.1582-2-alifm@linux.ibm.com>", "date": "2026-02-17T18:22:49", "name": "[v9,1/9] PCI: Allow per function PCI slots", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "efcebba69ef0fba2b1f37f1191c7e09a21a96501", "submitter": { "id": 73785, "url": "http://patchwork.ozlabs.org/api/1.0/people/73785/?format=api", "name": "Farhan Ali", "email": "alifm@linux.ibm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260217182257.1582-2-alifm@linux.ibm.com/mbox/", "series": [ { "id": 492470, "url": "http://patchwork.ozlabs.org/api/1.0/series/492470/?format=api", "date": "2026-02-17T18:22:49", "name": "Error recovery for vfio-pci devices on s390x", "version": 9, "mbox": "http://patchwork.ozlabs.org/series/492470/mbox/" } ], "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2197364/checks/", "tags": {}, "headers": { "Return-Path": "\n <linux-pci+bounces-47492-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-pci@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=FBPY5GL9;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-pci+bounces-47492-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com\n header.b=\"FBPY5GL9\"", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=148.163.158.5", "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.ibm.com", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=linux.ibm.com" ], "Received": [ "from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fFp0w0tFVz1xpl\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 18 Feb 2026 05:23:12 +1100 (AEDT)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 2B9DF300CE47\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Feb 2026 18:23:10 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 3DF3437107F;\n\tTue, 17 Feb 2026 18:23:09 +0000 (UTC)", "from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com\n [148.163.158.5])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id D545236E497;\n\tTue, 17 Feb 2026 18:23:07 +0000 (UTC)", "from pps.filterd (m0356516.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 61H8ukwD3353778;\n\tTue, 17 Feb 2026 18:23:01 GMT", "from ppma12.dal12v.mail.ibm.com\n (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220])\n\tby mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4caj644qdx-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tTue, 17 Feb 2026 18:23:01 +0000 (GMT)", "from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1])\n\tby ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id\n 61HG1VUk023899;\n\tTue, 17 Feb 2026 18:23:00 GMT", "from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9])\n\tby ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4ccb45441n-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tTue, 17 Feb 2026 18:23:00 +0000", "from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com\n [10.241.53.104])\n\tby smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 61HIMx0Y24052340\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n\tTue, 17 Feb 2026 18:23:00 GMT", "from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id D600D58056;\n\tTue, 17 Feb 2026 18:22:59 +0000 (GMT)", "from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 0EDB258052;\n\tTue, 17 Feb 2026 18:22:59 +0000 (GMT)", "from IBM-D32RQW3.ibm.com (unknown [9.61.242.249])\n\tby smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP;\n\tTue, 17 Feb 2026 18:22:58 +0000 (GMT)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771352589; cv=none;\n b=nP0nDgZy6Q71H2sc3aBkRBA99eqVronN8xARTQrFJhhLySFFnUQmkNF6c8A0+4D3KvRyg9b1angCF/MfJaHnqmEPMRE2QBLAOShVYPg9fj7FXsY1qEnjVNBFN9vWPaWDrNuJ+ECM2bIj53OrCUBAMbfeLFY20uNEWNl4BxHXKTM=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771352589; c=relaxed/simple;\n\tbh=OMenyl2shprXZ1KZp0pp5nevMGrtDA6idAvbhwf4lD8=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=d04Zz41aW96NT6ly6NCPFCT5SNgnOFoq5s8QYAWkngGLbHYMUIxk1ZJSD/Zi/oyqIZc+MsKHQI+0vBkuwjS9Hf7JPZ9zcY9w5tz6G0XV60q8U3dDJ+E1G0yTQaQWQwKtX/umlSTcl/K8sM53H6Hf6lgcDv0bdjgvLYCGohc5KuE=", "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.ibm.com;\n spf=pass smtp.mailfrom=linux.ibm.com;\n dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com\n header.b=FBPY5GL9; arc=none smtp.client-ip=148.163.158.5", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc\n\t:content-transfer-encoding:date:from:in-reply-to:message-id\n\t:mime-version:references:subject:to; s=pp1; bh=Y9dIYD3p1KrhhEB7Z\n\tJvf13N19iuQOY65AOMMOz8Qerg=; b=FBPY5GL9CLSduhsJHEEreG/qAvtF72K2i\n\twcwDn/uU0qxaJ9+8Lkju9gAFPwppHU5HDiuPATtcUVGzwnbT/fnK29xCFdH300Oc\n\tmc04Gtz8xnBknUrx1YIAce0vDpjWcxh/7zMVjqH8mSJ+KPshRgDPiMkD4Bc1iq5C\n\tfY5pRw8bsu5iKCuFK/p+uemfHtrgLlY/5LaVA2zppQTqlQFd/JFLBNBu8t9hP5Pl\n\tzsv39kod0y2oY/lDahhGQ75u5Y2yYN9eI7bQAFqiny4viB81BFBuSkYO4pbAzcZ4\n\trf62x4SiBK9KvSwI5w8YSFp5IhI/jQ3gez9U/CjDo+E3gTtHCPRNw==", "From": "Farhan Ali <alifm@linux.ibm.com>", "To": "linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,\n linux-pci@vger.kernel.org", "Cc": "helgaas@kernel.org, lukas@wunner.de, alex@shazbot.org, clg@redhat.com,\n stable@vger.kernel.org, alifm@linux.ibm.com, schnelle@linux.ibm.com,\n mjrosato@linux.ibm.com", "Subject": "[PATCH v9 1/9] PCI: Allow per function PCI slots", "Date": "Tue, 17 Feb 2026 10:22:49 -0800", "Message-ID": "<20260217182257.1582-2-alifm@linux.ibm.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20260217182257.1582-1-alifm@linux.ibm.com>", "References": "<20260217182257.1582-1-alifm@linux.ibm.com>", "Precedence": "bulk", "X-Mailing-List": "linux-pci@vger.kernel.org", "List-Id": "<linux-pci.vger.kernel.org>", "List-Subscribe": "<mailto:linux-pci+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-pci+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-TM-AS-GCONF": "00", "X-Proofpoint-ORIG-GUID": "DHJy_A6Y6TSmS__m9WagagZi-Nfs07Tm", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwMjE3MDE0OCBTYWx0ZWRfX/Zid/cwejnmR\n gWFT2WieJOzB0NI8gd3cnA56g+IS5D5BpU2hF7eHr/s8k6oI0lk5GJMZYnYTVlGO7J149mB3DJw\n yHAfX4T521qgnhIzBEeu/kZDCzQvjqIAA4VmukiJajiJ+rWag0JETZbKcXr7G7fj4C64XHrFQko\n DqIOtQtrhEJfY1XTIgRh++ig0mlc6ob8jmN5oxlnIDBNKzZP6Pxi1r2F7sk98y+qHOj0OyNCfaC\n NwoJjrmTouhC265P4huCPLMwbudO2MSO48I0ik/q1+J8KnGAiOvVZ/3LpFDp3VzfeCCCo0E5VkH\n OMfwGfH0GNnD1b/JoVhz4Mu1qOGu489DETWGI+dVj/DI5q7ZxzuxB4D3Jft3p9Rs+VreLvr4JmQ\n uBKvm+D13p/ccIeD2OkN5jecJoCqhZGsmo4WLzheMLGzChnlT9kONRL8ySRRZ+MaDcpwltIpU3W\n 607HrDivcxtPBTaiaSg==", "X-Proofpoint-GUID": "DHJy_A6Y6TSmS__m9WagagZi-Nfs07Tm", "X-Authority-Analysis": "v=2.4 cv=U+mfzOru c=1 sm=1 tr=0 ts=6994b205 cx=c_pps\n a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17\n a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22\n a=GgsMoib0sEa3-_RKJdDe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8\n a=Oaqo05sdQjFGKWlA34QA:9", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-02-17_03,2026-02-16_04,2025-10-01_01", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n clxscore=1015 bulkscore=0 impostorscore=0 malwarescore=0 spamscore=0\n adultscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501\n suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc=\n route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000\n definitions=main-2602170148" }, "content": "On s390 systems, which use a machine level hypervisor, PCI devices are\nalways accessed through a form of PCI pass-through which fundamentally\noperates on a per PCI function granularity. This is also reflected in the\ns390 PCI hotplug driver which creates hotplug slots for individual PCI\nfunctions. Its reset_slot() function, which is a wrapper for\nzpci_hot_reset_device(), thus also resets individual functions.\n\nCurrently, the kernel's PCI_SLOT() macro assigns the same pci_slot object\nto multifunction devices. This approach worked fine on s390 systems that\nonly exposed virtual functions as individual PCI domains to the operating\nsystem. Since commit 44510d6fa0c0 (\"s390/pci: Handling multifunctions\")\ns390 supports exposing the topology of multifunction PCI devices by\ngrouping them in a shared PCI domain. When attempting to reset a function\nthrough the hotplug driver, the shared slot assignment causes the wrong\nfunction to be reset instead of the intended one. It also leaks memory as\nwe do create a pci_slot object for the function, but don't correctly free\nit in pci_slot_release().\n\nAdd a flag for struct pci_slot to allow per function PCI slots for\nfunctions managed through a hypervisor, which exposes individual PCI\nfunctions while retaining the topology.\n\nFixes: 44510d6fa0c0 (\"s390/pci: Handling multifunctions\")\nCc: stable@vger.kernel.org\nSuggested-by: Niklas Schnelle <schnelle@linux.ibm.com>\nReviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>\nSigned-off-by: Farhan Ali <alifm@linux.ibm.com>\n---\n drivers/pci/pci.c | 5 +++--\n drivers/pci/slot.c | 25 ++++++++++++++++++++++---\n include/linux/pci.h | 1 +\n 3 files changed, 26 insertions(+), 5 deletions(-)", "diff": "diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c\nindex f3244630bfd0..3090c727b76f 100644\n--- a/drivers/pci/pci.c\n+++ b/drivers/pci/pci.c\n@@ -4869,8 +4869,9 @@ static int pci_reset_hotplug_slot(struct hotplug_slot *hotplug, bool probe)\n \n static int pci_dev_reset_slot_function(struct pci_dev *dev, bool probe)\n {\n-\tif (dev->multifunction || dev->subordinate || !dev->slot ||\n-\t dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET)\n+\tif (dev->subordinate || !dev->slot ||\n+\t dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET ||\n+\t (dev->multifunction && !dev->slot->per_func_slot))\n \t\treturn -ENOTTY;\n \n \treturn pci_reset_hotplug_slot(dev->slot->hotplug, probe);\ndiff --git a/drivers/pci/slot.c b/drivers/pci/slot.c\nindex 50fb3eb595fe..ed10fa3ae727 100644\n--- a/drivers/pci/slot.c\n+++ b/drivers/pci/slot.c\n@@ -63,6 +63,22 @@ static ssize_t cur_speed_read_file(struct pci_slot *slot, char *buf)\n \treturn bus_speed_read(slot->bus->cur_bus_speed, buf);\n }\n \n+static bool pci_dev_matches_slot(struct pci_dev *dev, struct pci_slot *slot)\n+{\n+\tif (slot->per_func_slot)\n+\t\treturn dev->devfn == slot->number;\n+\n+\treturn PCI_SLOT(dev->devfn) == slot->number;\n+}\n+\n+static bool pci_slot_enabled_per_func(void)\n+{\n+\tif (IS_ENABLED(CONFIG_S390))\n+\t\treturn true;\n+\n+\treturn false;\n+}\n+\n static void pci_slot_release(struct kobject *kobj)\n {\n \tstruct pci_dev *dev;\n@@ -73,7 +89,7 @@ static void pci_slot_release(struct kobject *kobj)\n \n \tdown_read(&pci_bus_sem);\n \tlist_for_each_entry(dev, &slot->bus->devices, bus_list)\n-\t\tif (PCI_SLOT(dev->devfn) == slot->number)\n+\t\tif (pci_dev_matches_slot(dev, slot))\n \t\t\tdev->slot = NULL;\n \tup_read(&pci_bus_sem);\n \n@@ -166,7 +182,7 @@ void pci_dev_assign_slot(struct pci_dev *dev)\n \n \tmutex_lock(&pci_slot_mutex);\n \tlist_for_each_entry(slot, &dev->bus->slots, list)\n-\t\tif (PCI_SLOT(dev->devfn) == slot->number)\n+\t\tif (pci_dev_matches_slot(dev, slot))\n \t\t\tdev->slot = slot;\n \tmutex_unlock(&pci_slot_mutex);\n }\n@@ -265,6 +281,9 @@ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,\n \tslot->bus = pci_bus_get(parent);\n \tslot->number = slot_nr;\n \n+\tif (pci_slot_enabled_per_func())\n+\t\tslot->per_func_slot = 1;\n+\n \tslot->kobj.kset = pci_slots_kset;\n \n \tslot_name = make_slot_name(name);\n@@ -285,7 +304,7 @@ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,\n \n \tdown_read(&pci_bus_sem);\n \tlist_for_each_entry(dev, &parent->devices, bus_list)\n-\t\tif (PCI_SLOT(dev->devfn) == slot_nr)\n+\t\tif (pci_dev_matches_slot(dev, slot))\n \t\t\tdev->slot = slot;\n \tup_read(&pci_bus_sem);\n \ndiff --git a/include/linux/pci.h b/include/linux/pci.h\nindex 1c270f1d5123..a9975d0e104f 100644\n--- a/include/linux/pci.h\n+++ b/include/linux/pci.h\n@@ -78,6 +78,7 @@ struct pci_slot {\n \tstruct list_head\tlist;\t\t/* Node in list of slots */\n \tstruct hotplug_slot\t*hotplug;\t/* Hotplug info (move here) */\n \tunsigned char\t\tnumber;\t\t/* PCI_SLOT(pci_dev->devfn) */\n+\tunsigned int\t\tper_func_slot:1; /* Allow per function slot */\n \tstruct kobject\t\tkobj;\n };\n \n", "prefixes": [ "v9", "1/9" ] }