diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-kernel/coreos-kernel-5.15.111.ebuild b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-kernel/coreos-kernel-6.1.27.ebuild similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-kernel/coreos-kernel-5.15.111.ebuild rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-kernel/coreos-kernel-6.1.27.ebuild diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/coreos-modules-5.15.111.ebuild b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/coreos-modules-6.1.27.ebuild similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/coreos-modules-5.15.111.ebuild rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/coreos-modules-6.1.27.ebuild diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/amd64_defconfig-5.15 b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/amd64_defconfig-6.1 similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/amd64_defconfig-5.15 rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/amd64_defconfig-6.1 diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/arm64_defconfig-5.15 b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/arm64_defconfig-6.1 similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/arm64_defconfig-5.15 rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/arm64_defconfig-6.1 diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/commonconfig-5.15 b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/commonconfig-6.1 similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/commonconfig-5.15 rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-modules/files/commonconfig-6.1 diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/Manifest b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/Manifest index d7ab8511bf..32c72c18dc 100644 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/Manifest +++ b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/Manifest @@ -1,2 +1,2 @@ -DIST linux-5.15.tar.xz 121913744 BLAKE2B 3921274b23f7938abdf3ed9334534b4581e13d7484303d3a5280eddb038999aaa8b836666a487472d9c4a219af0f06b9fecccaf348fb5510ab8762f4ef4b7e83 SHA512 d25ad40b5bcd6a4c6042fd0fd84e196e7a58024734c3e9a484fd0d5d54a0c1d87db8a3c784eff55e43b6f021709dc685eb0efa18d2aec327e4f88a79f405705a -DIST patch-5.15.111.xz 3991492 BLAKE2B 35ed3428b75ccc0c324c77461e242ee8f9cca82116cd4d3c4e9bed1219a7b3d711a378c7ff0f26f7bc23f245cff500307ff7c3a0316b440e7126a0238a83f611 SHA512 42285fcc483ba455b16b7d0d55739c37f72afc82b5b7bd59b6c312047b1ebe470670c5dd20cc3f8733cc590ab2e1d29bd5a3371beb7ade2de06232199f104f35 +DIST linux-6.1.tar.xz 134728520 BLAKE2B ae60257860b2bd1bd708d183f0443afc60ebbd2b3d535c45e44c2e541bd0928530a3b62de6385dd4e4726ebbedcc0a871d4f3ffb4105b9f1f6d8ed7467f5688e SHA512 6ed2a73c2699d0810e54753715635736fc370288ad5ce95c594f2379959b0e418665cd71bc512a0273fe226fe90074d8b10d14c209080a6466498417a4fdda68 +DIST patch-6.1.27.xz 1405244 BLAKE2B cfecf707c26cb84f13a4a9870c4db6d4077d5c98c7cb96ecb97cb2a5182a90fbb9ca367e1c646a983990b6654a1e0d7856d75768e4d340e1c3162da9a52211b8 SHA512 fbb0ef7c234febb76f4a99f5abc69c1aa989e6340a15eae1f035cbfefd15dfd85e93a0edb4e35c498a65602c1f796791a7e03583887a43e3f99f3f6a45380a50 diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/coreos-sources-5.15.111.ebuild b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/coreos-sources-6.1.27.ebuild similarity index 71% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/coreos-sources-5.15.111.ebuild rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/coreos-sources-6.1.27.ebuild index e9a1883c76..7e47d146bb 100644 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/coreos-sources-5.15.111.ebuild +++ b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/coreos-sources-6.1.27.ebuild @@ -36,10 +36,4 @@ IUSE="" # local patches overlap with the upstream patch. UNIPATCH_LIST=" ${PATCH_DIR}/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch \ - ${PATCH_DIR}/z0002-tools-objtool-Makefile-Don-t-fail-on-fallthrough-wit.patch \ - ${PATCH_DIR}/z0003-PCI-hv-Make-the-code-arch-neutral-by-adding-arch-spe.patch \ - ${PATCH_DIR}/z0004-PCI-hv-Add-arm64-Hyper-V-vPCI-support.patch \ - ${PATCH_DIR}/z0005-Drivers-hv-vmbus-Propagate-VMbus-coherence-to-each-V.patch \ - ${PATCH_DIR}/z0006-PCI-hv-Avoid-the-retarget-interrupt-hypercall-in-irq.patch \ - ${PATCH_DIR}/z0007-PCI-hv-Remove-unused-hv_set_msi_entry_from_desc.patch \ " diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0002-tools-objtool-Makefile-Don-t-fail-on-fallthrough-wit.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0002-tools-objtool-Makefile-Don-t-fail-on-fallthrough-wit.patch deleted file mode 100644 index af70221f4c..0000000000 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0002-tools-objtool-Makefile-Don-t-fail-on-fallthrough-wit.patch +++ /dev/null @@ -1,27 +0,0 @@ -From f654ed34d7082cad0b0105b8f54fc9d78b982eef Mon Sep 17 00:00:00 2001 -From: David Michael -Date: Thu, 8 Feb 2018 21:23:12 -0500 -Subject: [PATCH 2/7] tools/objtool/Makefile: Don't fail on fallthrough with - new GCCs - ---- - tools/lib/subcmd/Makefile | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/tools/lib/subcmd/Makefile b/tools/lib/subcmd/Makefile -index 1c777a72bb39..0217b7af786a 100644 ---- a/tools/lib/subcmd/Makefile -+++ b/tools/lib/subcmd/Makefile -@@ -40,6 +40,9 @@ ifneq ($(WERROR),0) - CFLAGS += -Werror - endif - -+# Don't fail on fallthrough with newer GCCs. -+CFLAGS += -Wno-error=implicit-fallthrough -+ - CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE - - CFLAGS += -I$(srctree)/tools/include/ --- -2.25.1 - diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0003-PCI-hv-Make-the-code-arch-neutral-by-adding-arch-spe.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0003-PCI-hv-Make-the-code-arch-neutral-by-adding-arch-spe.patch deleted file mode 100644 index 82866e511e..0000000000 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0003-PCI-hv-Make-the-code-arch-neutral-by-adding-arch-spe.patch +++ /dev/null @@ -1,309 +0,0 @@ -From 80f4d4e5e1042ea78c527d39f44ee16f5a2d3e5a Mon Sep 17 00:00:00 2001 -From: Sunil Muthuswamy -Date: Wed, 5 Jan 2022 11:32:35 -0800 -Subject: [PATCH 3/7] PCI: hv: Make the code arch neutral by adding arch - specific interfaces - -Encapsulate arch dependencies in Hyper-V vPCI through a set of -arch-dependent interfaces. Adding these arch specific interfaces will -allow for an implementation for other architectures, such as arm64. - -There are no functional changes expected from this patch. - -krnowak: Backport to 5.15 - this patch adds the hv_msi_get_int_vector -function for x64, so drop the same function that was brought in by -another patch backported to 5.15 from master. Similar thing goes for -the hv_msi_prepare function, but this time the function brought under -the CONFIG_X86 is amended to match the fixed variant that was already -a part of 5.15. - -Link: https://lore.kernel.org/r/1641411156-31705-2-git-send-email-sunilmut@linux.microsoft.com -Signed-off-by: Sunil Muthuswamy -Signed-off-by: Lorenzo Pieralisi -Signed-off-by: Bjorn Helgaas -Reviewed-by: Boqun Feng -Reviewed-by: Marc Zyngier -Reviewed-by: Michael Kelley ---- - arch/x86/include/asm/hyperv-tlfs.h | 33 ++++++++++ - drivers/pci/controller/pci-hyperv.c | 94 ++++++++++++++++------------- - include/asm-generic/hyperv-tlfs.h | 33 ---------- - 3 files changed, 85 insertions(+), 75 deletions(-) - -diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h -index 2322d6bd5883..fdf3d28fbdd5 100644 ---- a/arch/x86/include/asm/hyperv-tlfs.h -+++ b/arch/x86/include/asm/hyperv-tlfs.h -@@ -585,6 +585,39 @@ enum hv_interrupt_type { - HV_X64_INTERRUPT_TYPE_MAXIMUM = 0x000A, - }; - -+union hv_msi_address_register { -+ u32 as_uint32; -+ struct { -+ u32 reserved1:2; -+ u32 destination_mode:1; -+ u32 redirection_hint:1; -+ u32 reserved2:8; -+ u32 destination_id:8; -+ u32 msi_base:12; -+ }; -+} __packed; -+ -+union hv_msi_data_register { -+ u32 as_uint32; -+ struct { -+ u32 vector:8; -+ u32 delivery_mode:3; -+ u32 reserved1:3; -+ u32 level_assert:1; -+ u32 trigger_mode:1; -+ u32 reserved2:16; -+ }; -+} __packed; -+ -+/* HvRetargetDeviceInterrupt hypercall */ -+union hv_msi_entry { -+ u64 as_uint64; -+ struct { -+ union hv_msi_address_register address; -+ union hv_msi_data_register data; -+ } __packed; -+}; -+ - #include - - #endif -diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c -index 9b54715a4b63..601d06fe1adc 100644 ---- a/drivers/pci/controller/pci-hyperv.c -+++ b/drivers/pci/controller/pci-hyperv.c -@@ -43,9 +43,6 @@ - #include - #include - #include --#include --#include --#include - #include - #include - #include -@@ -583,6 +580,44 @@ struct hv_pci_compl { - - static void hv_pci_onchannelcallback(void *context); - -+#ifdef CONFIG_X86 -+#define DELIVERY_MODE APIC_DELIVERY_MODE_FIXED -+#define FLOW_HANDLER handle_edge_irq -+#define FLOW_NAME "edge" -+ -+static int hv_pci_irqchip_init(void) -+{ -+ return 0; -+} -+ -+static struct irq_domain *hv_pci_get_root_domain(void) -+{ -+ return x86_vector_domain; -+} -+ -+static unsigned int hv_msi_get_int_vector(struct irq_data *data) -+{ -+ struct irq_cfg *cfg = irqd_cfg(data); -+ -+ return cfg->vector; -+} -+ -+static int hv_msi_prepare(struct irq_domain *domain, struct device *dev, -+ int nvec, msi_alloc_info_t *info) -+{ -+ int ret = pci_msi_prepare(domain, dev, nvec, info); -+ -+ /* -+ * By using the interrupt remapper in the hypervisor IOMMU, contiguous -+ * CPU vectors is not needed for multi-MSI -+ */ -+ if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI) -+ info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS; -+ -+ return ret; -+} -+#endif /* CONFIG_X86 */ -+ - /** - * hv_pci_generic_compl() - Invoked for a completion packet - * @context: Set up by the sender of the packet. -@@ -1195,41 +1230,11 @@ static void hv_msi_free(struct irq_domain *domain, struct msi_domain_info *info, - put_pcichild(hpdev); - } - --static int hv_set_affinity(struct irq_data *data, const struct cpumask *dest, -- bool force) --{ -- struct irq_data *parent = data->parent_data; -- -- return parent->chip->irq_set_affinity(parent, dest, force); --} -- - static void hv_irq_mask(struct irq_data *data) - { - pci_msi_mask_irq(data); - } - --static unsigned int hv_msi_get_int_vector(struct irq_data *data) --{ -- struct irq_cfg *cfg = irqd_cfg(data); -- -- return cfg->vector; --} -- --static int hv_msi_prepare(struct irq_domain *domain, struct device *dev, -- int nvec, msi_alloc_info_t *info) --{ -- int ret = pci_msi_prepare(domain, dev, nvec, info); -- -- /* -- * By using the interrupt remapper in the hypervisor IOMMU, contiguous -- * CPU vectors is not needed for multi-MSI -- */ -- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI) -- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS; -- -- return ret; --} -- - /** - * hv_irq_unmask() - "Unmask" the IRQ by setting its current - * affinity. -@@ -1243,7 +1248,6 @@ static int hv_msi_prepare(struct irq_domain *domain, struct device *dev, - static void hv_irq_unmask(struct irq_data *data) - { - struct msi_desc *msi_desc = irq_data_get_msi_desc(data); -- struct irq_cfg *cfg = irqd_cfg(data); - struct hv_retarget_device_interrupt *params; - struct tran_int_desc *int_desc; - struct hv_pcibus_device *hbus; -@@ -1275,7 +1279,7 @@ static void hv_irq_unmask(struct irq_data *data) - (hbus->hdev->dev_instance.b[7] << 8) | - (hbus->hdev->dev_instance.b[6] & 0xf8) | - PCI_FUNC(pdev->devfn); -- params->int_target.vector = cfg->vector; -+ params->int_target.vector = hv_msi_get_int_vector(data); - - /* - * Honoring apic->delivery_mode set to APIC_DELIVERY_MODE_FIXED by -@@ -1376,7 +1380,7 @@ static u32 hv_compose_msi_req_v1( - int_pkt->wslot.slot = slot; - int_pkt->int_desc.vector = vector; - int_pkt->int_desc.vector_count = vector_count; -- int_pkt->int_desc.delivery_mode = APIC_DELIVERY_MODE_FIXED; -+ int_pkt->int_desc.delivery_mode = DELIVERY_MODE; - - /* - * Create MSI w/ dummy vCPU set, overwritten by subsequent retarget in -@@ -1406,7 +1410,7 @@ static u32 hv_compose_msi_req_v2( - int_pkt->wslot.slot = slot; - int_pkt->int_desc.vector = vector; - int_pkt->int_desc.vector_count = vector_count; -- int_pkt->int_desc.delivery_mode = APIC_DELIVERY_MODE_FIXED; -+ int_pkt->int_desc.delivery_mode = DELIVERY_MODE; - cpu = hv_compose_msi_req_get_cpu(affinity); - int_pkt->int_desc.processor_array[0] = - hv_cpu_number_to_vp_number(cpu); -@@ -1426,7 +1430,7 @@ static u32 hv_compose_msi_req_v3( - int_pkt->int_desc.vector = vector; - int_pkt->int_desc.reserved = 0; - int_pkt->int_desc.vector_count = vector_count; -- int_pkt->int_desc.delivery_mode = APIC_DELIVERY_MODE_FIXED; -+ int_pkt->int_desc.delivery_mode = DELIVERY_MODE; - cpu = hv_compose_msi_req_get_cpu(affinity); - int_pkt->int_desc.processor_array[0] = - hv_cpu_number_to_vp_number(cpu); -@@ -1660,7 +1664,7 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) - static struct irq_chip hv_msi_irq_chip = { - .name = "Hyper-V PCIe MSI", - .irq_compose_msi_msg = hv_compose_msi_msg, -- .irq_set_affinity = hv_set_affinity, -+ .irq_set_affinity = irq_chip_set_affinity_parent, - .irq_ack = irq_chip_ack_parent, - .irq_mask = hv_irq_mask, - .irq_unmask = hv_irq_unmask, -@@ -1691,12 +1695,12 @@ static int hv_pcie_init_irq_domain(struct hv_pcibus_device *hbus) - hbus->msi_info.flags = (MSI_FLAG_USE_DEF_DOM_OPS | - MSI_FLAG_USE_DEF_CHIP_OPS | MSI_FLAG_MULTI_PCI_MSI | - MSI_FLAG_PCI_MSIX); -- hbus->msi_info.handler = handle_edge_irq; -- hbus->msi_info.handler_name = "edge"; -+ hbus->msi_info.handler = FLOW_HANDLER; -+ hbus->msi_info.handler_name = FLOW_NAME; - hbus->msi_info.data = hbus; - hbus->irq_domain = pci_msi_create_irq_domain(hbus->fwnode, - &hbus->msi_info, -- x86_vector_domain); -+ hv_pci_get_root_domain()); - if (!hbus->irq_domain) { - dev_err(&hbus->hdev->device, - "Failed to build an MSI IRQ domain\n"); -@@ -3626,9 +3630,15 @@ static void __exit exit_hv_pci_drv(void) - - static int __init init_hv_pci_drv(void) - { -+ int ret; -+ - if (!hv_is_hyperv_initialized()) - return -ENODEV; - -+ ret = hv_pci_irqchip_init(); -+ if (ret) -+ return ret; -+ - /* Set the invalid domain number's bit, so it will not be used */ - set_bit(HVPCI_DOM_INVALID, hvpci_dom_map); - -diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h -index 56348a541c50..45cc0c3b8ed7 100644 ---- a/include/asm-generic/hyperv-tlfs.h -+++ b/include/asm-generic/hyperv-tlfs.h -@@ -539,39 +539,6 @@ enum hv_interrupt_source { - HV_INTERRUPT_SOURCE_IOAPIC, - }; - --union hv_msi_address_register { -- u32 as_uint32; -- struct { -- u32 reserved1:2; -- u32 destination_mode:1; -- u32 redirection_hint:1; -- u32 reserved2:8; -- u32 destination_id:8; -- u32 msi_base:12; -- }; --} __packed; -- --union hv_msi_data_register { -- u32 as_uint32; -- struct { -- u32 vector:8; -- u32 delivery_mode:3; -- u32 reserved1:3; -- u32 level_assert:1; -- u32 trigger_mode:1; -- u32 reserved2:16; -- }; --} __packed; -- --/* HvRetargetDeviceInterrupt hypercall */ --union hv_msi_entry { -- u64 as_uint64; -- struct { -- union hv_msi_address_register address; -- union hv_msi_data_register data; -- } __packed; --}; -- - union hv_ioapic_rte { - u64 as_uint64; - --- -2.25.1 - diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0004-PCI-hv-Add-arm64-Hyper-V-vPCI-support.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0004-PCI-hv-Add-arm64-Hyper-V-vPCI-support.patch deleted file mode 100644 index 05d66b9d6b..0000000000 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0004-PCI-hv-Add-arm64-Hyper-V-vPCI-support.patch +++ /dev/null @@ -1,349 +0,0 @@ -From 802291ee132c756996438afb97dd9d25f9fa5d08 Mon Sep 17 00:00:00 2001 -From: Sunil Muthuswamy -Date: Wed, 5 Jan 2022 11:32:36 -0800 -Subject: [PATCH 4/7] PCI: hv: Add arm64 Hyper-V vPCI support - -Add arm64 Hyper-V vPCI support by implementing the arch specific -interfaces. Introduce an IRQ domain and chip specific to Hyper-v vPCI that -is based on SPIs. The IRQ domain parents itself to the arch GIC IRQ domain -for basic vector management. - -[bhelgaas: squash in fix from Yang Li : -https://lore.kernel.org/r/20220112003324.62755-1-yang.lee@linux.alibaba.com] -Link: https://lore.kernel.org/r/1641411156-31705-3-git-send-email-sunilmut@linux.microsoft.com -Signed-off-by: Sunil Muthuswamy -Signed-off-by: Lorenzo Pieralisi -Signed-off-by: Bjorn Helgaas -Reviewed-by: Marc Zyngier -Reviewed-by: Michael Kelley ---- - arch/arm64/include/asm/hyperv-tlfs.h | 9 + - drivers/pci/Kconfig | 2 +- - drivers/pci/controller/Kconfig | 2 +- - drivers/pci/controller/pci-hyperv.c | 235 ++++++++++++++++++++++++++- - 4 files changed, 245 insertions(+), 3 deletions(-) - -diff --git a/arch/arm64/include/asm/hyperv-tlfs.h b/arch/arm64/include/asm/hyperv-tlfs.h -index 4d964a7f02ee..bc6c7ac934a1 100644 ---- a/arch/arm64/include/asm/hyperv-tlfs.h -+++ b/arch/arm64/include/asm/hyperv-tlfs.h -@@ -64,6 +64,15 @@ - #define HV_REGISTER_STIMER0_CONFIG 0x000B0000 - #define HV_REGISTER_STIMER0_COUNT 0x000B0001 - -+union hv_msi_entry { -+ u64 as_uint64[2]; -+ struct { -+ u64 address; -+ u32 data; -+ u32 reserved; -+ } __packed; -+}; -+ - #include - - #endif -diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig -index 43e615aa12ff..d98fafdd0f99 100644 ---- a/drivers/pci/Kconfig -+++ b/drivers/pci/Kconfig -@@ -184,7 +184,7 @@ config PCI_LABEL - - config PCI_HYPERV - tristate "Hyper-V PCI Frontend" -- depends on X86_64 && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS -+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS - select PCI_HYPERV_INTERFACE - help - The PCI device frontend driver allows the kernel to import arbitrary -diff --git a/drivers/pci/controller/Kconfig b/drivers/pci/controller/Kconfig -index 326f7d13024f..b24edba0b870 100644 ---- a/drivers/pci/controller/Kconfig -+++ b/drivers/pci/controller/Kconfig -@@ -280,7 +280,7 @@ config PCIE_BRCMSTB - - config PCI_HYPERV_INTERFACE - tristate "Hyper-V PCI Interface" -- depends on X86 && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && X86_64 -+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN - help - The Hyper-V PCI Interface is a helper driver allows other drivers to - have a common interface with the Hyper-V PCI frontend driver. -diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c -index 601d06fe1adc..42c625bc5944 100644 ---- a/drivers/pci/controller/pci-hyperv.c -+++ b/drivers/pci/controller/pci-hyperv.c -@@ -47,6 +47,8 @@ - #include - #include - #include -+#include -+#include - #include - - /* -@@ -616,7 +618,230 @@ static int hv_msi_prepare(struct irq_domain *domain, struct device *dev, - - return ret; - } --#endif /* CONFIG_X86 */ -+#elif defined(CONFIG_ARM64) -+/* -+ * SPI vectors to use for vPCI; arch SPIs range is [32, 1019], but leaving a bit -+ * of room at the start to allow for SPIs to be specified through ACPI and -+ * starting with a power of two to satisfy power of 2 multi-MSI requirement. -+ */ -+#define HV_PCI_MSI_SPI_START 64 -+#define HV_PCI_MSI_SPI_NR (1020 - HV_PCI_MSI_SPI_START) -+#define DELIVERY_MODE 0 -+#define FLOW_HANDLER NULL -+#define FLOW_NAME NULL -+#define hv_msi_prepare NULL -+ -+struct hv_pci_chip_data { -+ DECLARE_BITMAP(spi_map, HV_PCI_MSI_SPI_NR); -+ struct mutex map_lock; -+}; -+ -+/* Hyper-V vPCI MSI GIC IRQ domain */ -+static struct irq_domain *hv_msi_gic_irq_domain; -+ -+/* Hyper-V PCI MSI IRQ chip */ -+static struct irq_chip hv_arm64_msi_irq_chip = { -+ .name = "MSI", -+ .irq_set_affinity = irq_chip_set_affinity_parent, -+ .irq_eoi = irq_chip_eoi_parent, -+ .irq_mask = irq_chip_mask_parent, -+ .irq_unmask = irq_chip_unmask_parent -+}; -+ -+static unsigned int hv_msi_get_int_vector(struct irq_data *irqd) -+{ -+ return irqd->parent_data->hwirq; -+} -+ -+static void hv_set_msi_entry_from_desc(union hv_msi_entry *msi_entry, -+ struct msi_desc *msi_desc) -+{ -+ msi_entry->address = ((u64)msi_desc->msg.address_hi << 32) | -+ msi_desc->msg.address_lo; -+ msi_entry->data = msi_desc->msg.data; -+} -+ -+/* -+ * @nr_bm_irqs: Indicates the number of IRQs that were allocated from -+ * the bitmap. -+ * @nr_dom_irqs: Indicates the number of IRQs that were allocated from -+ * the parent domain. -+ */ -+static void hv_pci_vec_irq_free(struct irq_domain *domain, -+ unsigned int virq, -+ unsigned int nr_bm_irqs, -+ unsigned int nr_dom_irqs) -+{ -+ struct hv_pci_chip_data *chip_data = domain->host_data; -+ struct irq_data *d = irq_domain_get_irq_data(domain, virq); -+ int first = d->hwirq - HV_PCI_MSI_SPI_START; -+ int i; -+ -+ mutex_lock(&chip_data->map_lock); -+ bitmap_release_region(chip_data->spi_map, -+ first, -+ get_count_order(nr_bm_irqs)); -+ mutex_unlock(&chip_data->map_lock); -+ for (i = 0; i < nr_dom_irqs; i++) { -+ if (i) -+ d = irq_domain_get_irq_data(domain, virq + i); -+ irq_domain_reset_irq_data(d); -+ } -+ -+ irq_domain_free_irqs_parent(domain, virq, nr_dom_irqs); -+} -+ -+static void hv_pci_vec_irq_domain_free(struct irq_domain *domain, -+ unsigned int virq, -+ unsigned int nr_irqs) -+{ -+ hv_pci_vec_irq_free(domain, virq, nr_irqs, nr_irqs); -+} -+ -+static int hv_pci_vec_alloc_device_irq(struct irq_domain *domain, -+ unsigned int nr_irqs, -+ irq_hw_number_t *hwirq) -+{ -+ struct hv_pci_chip_data *chip_data = domain->host_data; -+ int index; -+ -+ /* Find and allocate region from the SPI bitmap */ -+ mutex_lock(&chip_data->map_lock); -+ index = bitmap_find_free_region(chip_data->spi_map, -+ HV_PCI_MSI_SPI_NR, -+ get_count_order(nr_irqs)); -+ mutex_unlock(&chip_data->map_lock); -+ if (index < 0) -+ return -ENOSPC; -+ -+ *hwirq = index + HV_PCI_MSI_SPI_START; -+ -+ return 0; -+} -+ -+static int hv_pci_vec_irq_gic_domain_alloc(struct irq_domain *domain, -+ unsigned int virq, -+ irq_hw_number_t hwirq) -+{ -+ struct irq_fwspec fwspec; -+ struct irq_data *d; -+ int ret; -+ -+ fwspec.fwnode = domain->parent->fwnode; -+ fwspec.param_count = 2; -+ fwspec.param[0] = hwirq; -+ fwspec.param[1] = IRQ_TYPE_EDGE_RISING; -+ -+ ret = irq_domain_alloc_irqs_parent(domain, virq, 1, &fwspec); -+ if (ret) -+ return ret; -+ -+ /* -+ * Since the interrupt specifier is not coming from ACPI or DT, the -+ * trigger type will need to be set explicitly. Otherwise, it will be -+ * set to whatever is in the GIC configuration. -+ */ -+ d = irq_domain_get_irq_data(domain->parent, virq); -+ -+ return d->chip->irq_set_type(d, IRQ_TYPE_EDGE_RISING); -+} -+ -+static int hv_pci_vec_irq_domain_alloc(struct irq_domain *domain, -+ unsigned int virq, unsigned int nr_irqs, -+ void *args) -+{ -+ irq_hw_number_t hwirq; -+ unsigned int i; -+ int ret; -+ -+ ret = hv_pci_vec_alloc_device_irq(domain, nr_irqs, &hwirq); -+ if (ret) -+ return ret; -+ -+ for (i = 0; i < nr_irqs; i++) { -+ ret = hv_pci_vec_irq_gic_domain_alloc(domain, virq + i, -+ hwirq + i); -+ if (ret) { -+ hv_pci_vec_irq_free(domain, virq, nr_irqs, i); -+ return ret; -+ } -+ -+ irq_domain_set_hwirq_and_chip(domain, virq + i, -+ hwirq + i, -+ &hv_arm64_msi_irq_chip, -+ domain->host_data); -+ pr_debug("pID:%d vID:%u\n", (int)(hwirq + i), virq + i); -+ } -+ -+ return 0; -+} -+ -+/* -+ * Pick the first cpu as the irq affinity that can be temporarily used for -+ * composing MSI from the hypervisor. GIC will eventually set the right -+ * affinity for the irq and the 'unmask' will retarget the interrupt to that -+ * cpu. -+ */ -+static int hv_pci_vec_irq_domain_activate(struct irq_domain *domain, -+ struct irq_data *irqd, bool reserve) -+{ -+ int cpu = cpumask_first(cpu_present_mask); -+ -+ irq_data_update_effective_affinity(irqd, cpumask_of(cpu)); -+ -+ return 0; -+} -+ -+static const struct irq_domain_ops hv_pci_domain_ops = { -+ .alloc = hv_pci_vec_irq_domain_alloc, -+ .free = hv_pci_vec_irq_domain_free, -+ .activate = hv_pci_vec_irq_domain_activate, -+}; -+ -+static int hv_pci_irqchip_init(void) -+{ -+ static struct hv_pci_chip_data *chip_data; -+ struct fwnode_handle *fn = NULL; -+ int ret = -ENOMEM; -+ -+ chip_data = kzalloc(sizeof(*chip_data), GFP_KERNEL); -+ if (!chip_data) -+ return ret; -+ -+ mutex_init(&chip_data->map_lock); -+ fn = irq_domain_alloc_named_fwnode("hv_vpci_arm64"); -+ if (!fn) -+ goto free_chip; -+ -+ /* -+ * IRQ domain once enabled, should not be removed since there is no -+ * way to ensure that all the corresponding devices are also gone and -+ * no interrupts will be generated. -+ */ -+ hv_msi_gic_irq_domain = acpi_irq_create_hierarchy(0, HV_PCI_MSI_SPI_NR, -+ fn, &hv_pci_domain_ops, -+ chip_data); -+ -+ if (!hv_msi_gic_irq_domain) { -+ pr_err("Failed to create Hyper-V arm64 vPCI MSI IRQ domain\n"); -+ goto free_chip; -+ } -+ -+ return 0; -+ -+free_chip: -+ kfree(chip_data); -+ if (fn) -+ irq_domain_free_fwnode(fn); -+ -+ return ret; -+} -+ -+static struct irq_domain *hv_pci_get_root_domain(void) -+{ -+ return hv_msi_gic_irq_domain; -+} -+#endif /* CONFIG_ARM64 */ - - /** - * hv_pci_generic_compl() - Invoked for a completion packet -@@ -1233,6 +1458,8 @@ static void hv_msi_free(struct irq_domain *domain, struct msi_domain_info *info, - static void hv_irq_mask(struct irq_data *data) - { - pci_msi_mask_irq(data); -+ if (data->parent_data->chip->irq_mask) -+ irq_chip_mask_parent(data); - } - - /** -@@ -1352,6 +1579,8 @@ static void hv_irq_unmask(struct irq_data *data) - dev_err(&hbus->hdev->device, - "%s() failed: %#llx", __func__, res); - -+ if (data->parent_data->chip->irq_unmask) -+ irq_chip_unmask_parent(data); - pci_msi_unmask_irq(data); - } - -@@ -1665,7 +1894,11 @@ static struct irq_chip hv_msi_irq_chip = { - .name = "Hyper-V PCIe MSI", - .irq_compose_msi_msg = hv_compose_msi_msg, - .irq_set_affinity = irq_chip_set_affinity_parent, -+#ifdef CONFIG_X86 - .irq_ack = irq_chip_ack_parent, -+#elif defined(CONFIG_ARM64) -+ .irq_eoi = irq_chip_eoi_parent, -+#endif - .irq_mask = hv_irq_mask, - .irq_unmask = hv_irq_unmask, - }; --- -2.25.1 - diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0005-Drivers-hv-vmbus-Propagate-VMbus-coherence-to-each-V.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0005-Drivers-hv-vmbus-Propagate-VMbus-coherence-to-each-V.patch deleted file mode 100644 index 7e5588a061..0000000000 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0005-Drivers-hv-vmbus-Propagate-VMbus-coherence-to-each-V.patch +++ /dev/null @@ -1,132 +0,0 @@ -From cdbc1cd23ea659b8fc8f67fa0d88654eb90a01fe Mon Sep 17 00:00:00 2001 -From: Michael Kelley -Date: Thu, 24 Mar 2022 09:14:51 -0700 -Subject: [PATCH 5/7] Drivers: hv: vmbus: Propagate VMbus coherence to each - VMbus device - -VMbus synthetic devices are not represented in the ACPI DSDT -- only -the top level VMbus device is represented. As a result, on ARM64 -coherence information in the _CCA method is not specified for -synthetic devices, so they default to not hardware coherent. -Drivers for some of these synthetic devices have been recently -updated to use the standard DMA APIs, and they are incurring extra -overhead of unneeded software coherence management. - -Fix this by propagating coherence information from the VMbus node -in ACPI to the individual synthetic devices. There's no effect on -x86/x64 where devices are always hardware coherent. - -krnowak: Backport to 5.15 - fixed conflict stemming from hv_map_memory -and hv_unmap_memory being in diff context. These functions do not -exist in 5.15. - -Signed-off-by: Michael Kelley -Acked-by: Robin Murphy -Link: https://lore.kernel.org/r/1648138492-2191-2-git-send-email-mikelley@microsoft.com -Signed-off-by: Wei Liu ---- - drivers/hv/hv_common.c | 11 +++++++++++ - drivers/hv/vmbus_drv.c | 31 +++++++++++++++++++++++++++++++ - include/asm-generic/mshyperv.h | 1 + - 3 files changed, 43 insertions(+) - -diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c -index c0d9048a4112..196cedd5f37c 100644 ---- a/drivers/hv/hv_common.c -+++ b/drivers/hv/hv_common.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -216,6 +217,16 @@ bool hv_query_ext_cap(u64 cap_query) - } - EXPORT_SYMBOL_GPL(hv_query_ext_cap); - -+void hv_setup_dma_ops(struct device *dev, bool coherent) -+{ -+ /* -+ * Hyper-V does not offer a vIOMMU in the guest -+ * VM, so pass 0/NULL for the IOMMU settings -+ */ -+ arch_setup_dma_ops(dev, 0, 0, NULL, coherent); -+} -+EXPORT_SYMBOL_GPL(hv_setup_dma_ops); -+ - bool hv_is_hibernation_supported(void) - { - return !hv_root_partition && acpi_sleep_state_supported(ACPI_STATE_S4); -diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index 50d9113f5402..1f38d0a6548d 100644 ---- a/drivers/hv/vmbus_drv.c -+++ b/drivers/hv/vmbus_drv.c -@@ -919,6 +919,21 @@ static int vmbus_probe(struct device *child_device) - return ret; - } - -+/* -+ * vmbus_dma_configure -- Configure DMA coherence for VMbus device -+ */ -+static int vmbus_dma_configure(struct device *child_device) -+{ -+ /* -+ * On ARM64, propagate the DMA coherence setting from the top level -+ * VMbus ACPI device to the child VMbus device being added here. -+ * On x86/x64 coherence is assumed and these calls have no effect. -+ */ -+ hv_setup_dma_ops(child_device, -+ device_get_dma_attr(&hv_acpi_dev->dev) == DEV_DMA_COHERENT); -+ return 0; -+} -+ - /* - * vmbus_remove - Remove a vmbus device - */ -@@ -1039,6 +1054,7 @@ static struct bus_type hv_bus = { - .remove = vmbus_remove, - .probe = vmbus_probe, - .uevent = vmbus_uevent, -+ .dma_configure = vmbus_dma_configure, - .dev_groups = vmbus_dev_groups, - .drv_groups = vmbus_drv_groups, - .bus_groups = vmbus_bus_groups, -@@ -2430,6 +2446,21 @@ static int vmbus_acpi_add(struct acpi_device *device) - - hv_acpi_dev = device; - -+ /* -+ * Older versions of Hyper-V for ARM64 fail to include the _CCA -+ * method on the top level VMbus device in the DSDT. But devices -+ * are hardware coherent in all current Hyper-V use cases, so fix -+ * up the ACPI device to behave as if _CCA is present and indicates -+ * hardware coherence. -+ */ -+ ACPI_COMPANION_SET(&device->dev, device); -+ if (IS_ENABLED(CONFIG_ACPI_CCA_REQUIRED) && -+ device_get_dma_attr(&device->dev) == DEV_DMA_NOT_SUPPORTED) { -+ pr_info("No ACPI _CCA found; assuming coherent device I/O\n"); -+ device->flags.cca_seen = true; -+ device->flags.coherent_dma = true; -+ } -+ - result = acpi_walk_resources(device->handle, METHOD_NAME__CRS, - vmbus_walk_resources, NULL); - -diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h -index d3eae6cdbacb..807f1b524af2 100644 ---- a/include/asm-generic/mshyperv.h -+++ b/include/asm-generic/mshyperv.h -@@ -256,6 +256,7 @@ enum hv_isolation_type hv_get_isolation_type(void); - bool hv_is_isolation_supported(void); - void hyperv_cleanup(void); - bool hv_query_ext_cap(u64 cap_query); -+void hv_setup_dma_ops(struct device *dev, bool coherent); - #else /* CONFIG_HYPERV */ - static inline bool hv_is_hyperv_initialized(void) { return false; } - static inline bool hv_is_hibernation_supported(void) { return false; } --- -2.25.1 - diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0006-PCI-hv-Avoid-the-retarget-interrupt-hypercall-in-irq.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0006-PCI-hv-Avoid-the-retarget-interrupt-hypercall-in-irq.patch deleted file mode 100644 index e95fbd646c..0000000000 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0006-PCI-hv-Avoid-the-retarget-interrupt-hypercall-in-irq.patch +++ /dev/null @@ -1,302 +0,0 @@ -From 72b9ec2f281657bd50c8acfc0aa297ccd9a9f260 Mon Sep 17 00:00:00 2001 -From: Boqun Feng -Date: Thu, 17 Feb 2022 11:45:19 +0800 -Subject: [PATCH 6/7] PCI: hv: Avoid the retarget interrupt hypercall in - irq_unmask() on ARM64 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -On ARM64 Hyper-V guests, SPIs are used for the interrupts of virtual PCI -devices, and SPIs can be managed directly via GICD registers. Therefore -the retarget interrupt hypercall is not needed on ARM64. - -An arch-specific interface hv_arch_irq_unmask() is introduced to handle -the architecture level differences on this. For x86, the behavior -remains unchanged, while for ARM64 no hypercall is invoked when -unmasking an irq for virtual PCI devices. - -Link: https://lore.kernel.org/r/20220217034525.1687678-1-boqun.feng@gmail.com -Signed-off-by: Boqun Feng -Signed-off-by: Lorenzo Pieralisi -Reviewed-by: Michael Kelley - -jepio: Upstream commit d06957d7a6929e6a4aa959cb59d66f0c095fc974+squashed -455880dfe292a2bdd3b4ad6a107299fce610e64b into this. 5.15 contains 455880d -(35d24b115a407c0a1a73900d025da77be2763ed3) but not the rest of ARM64+PCI -enablement (which we carry) so without this patch there is a build failure: - - drivers/pci/controller/pci-hyperv.c:1509:37: error: request for member ���as_uint32��� in something not a structure or union ---- - drivers/pci/controller/pci-hyperv.c | 239 +++++++++++++++------------- - 1 file changed, 125 insertions(+), 114 deletions(-) - -diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c -index 42c625bc5944..165dfb98d3d8 100644 ---- a/drivers/pci/controller/pci-hyperv.c -+++ b/drivers/pci/controller/pci-hyperv.c -@@ -618,6 +618,124 @@ static int hv_msi_prepare(struct irq_domain *domain, struct device *dev, - - return ret; - } -+ -+/** -+ * hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current -+ * affinity. -+ * @data: Describes the IRQ -+ * -+ * Build new a destination for the MSI and make a hypercall to -+ * update the Interrupt Redirection Table. "Device Logical ID" -+ * is built out of this PCI bus's instance GUID and the function -+ * number of the device. -+ */ -+static void hv_arch_irq_unmask(struct irq_data *data) -+{ -+ struct msi_desc *msi_desc = irq_data_get_msi_desc(data); -+ struct hv_retarget_device_interrupt *params; -+ struct tran_int_desc *int_desc; -+ struct hv_pcibus_device *hbus; -+ struct cpumask *dest; -+ cpumask_var_t tmp; -+ struct pci_bus *pbus; -+ struct pci_dev *pdev; -+ unsigned long flags; -+ u32 var_size = 0; -+ int cpu, nr_bank; -+ u64 res; -+ -+ dest = irq_data_get_effective_affinity_mask(data); -+ pdev = msi_desc_to_pci_dev(msi_desc); -+ pbus = pdev->bus; -+ hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata); -+ int_desc = data->chip_data; -+ -+ spin_lock_irqsave(&hbus->retarget_msi_interrupt_lock, flags); -+ -+ params = &hbus->retarget_msi_interrupt_params; -+ memset(params, 0, sizeof(*params)); -+ params->partition_id = HV_PARTITION_ID_SELF; -+ params->int_entry.source = HV_INTERRUPT_SOURCE_MSI; -+ params->int_entry.msi_entry.address.as_uint32 = int_desc->address & 0xffffffff; -+ params->int_entry.msi_entry.data.as_uint32 = int_desc->data; -+ params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | -+ (hbus->hdev->dev_instance.b[4] << 16) | -+ (hbus->hdev->dev_instance.b[7] << 8) | -+ (hbus->hdev->dev_instance.b[6] & 0xf8) | -+ PCI_FUNC(pdev->devfn); -+ params->int_target.vector = hv_msi_get_int_vector(data); -+ -+ /* -+ * Honoring apic->delivery_mode set to APIC_DELIVERY_MODE_FIXED by -+ * setting the HV_DEVICE_INTERRUPT_TARGET_MULTICAST flag results in a -+ * spurious interrupt storm. Not doing so does not seem to have a -+ * negative effect (yet?). -+ */ -+ -+ if (hbus->protocol_version >= PCI_PROTOCOL_VERSION_1_2) { -+ /* -+ * PCI_PROTOCOL_VERSION_1_2 supports the VP_SET version of the -+ * HVCALL_RETARGET_INTERRUPT hypercall, which also coincides -+ * with >64 VP support. -+ * ms_hyperv.hints & HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED -+ * is not sufficient for this hypercall. -+ */ -+ params->int_target.flags |= -+ HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET; -+ -+ if (!alloc_cpumask_var(&tmp, GFP_ATOMIC)) { -+ res = 1; -+ goto exit_unlock; -+ } -+ -+ cpumask_and(tmp, dest, cpu_online_mask); -+ nr_bank = cpumask_to_vpset(¶ms->int_target.vp_set, tmp); -+ free_cpumask_var(tmp); -+ -+ if (nr_bank <= 0) { -+ res = 1; -+ goto exit_unlock; -+ } -+ -+ /* -+ * var-sized hypercall, var-size starts after vp_mask (thus -+ * vp_set.format does not count, but vp_set.valid_bank_mask -+ * does). -+ */ -+ var_size = 1 + nr_bank; -+ } else { -+ for_each_cpu_and(cpu, dest, cpu_online_mask) { -+ params->int_target.vp_mask |= -+ (1ULL << hv_cpu_number_to_vp_number(cpu)); -+ } -+ } -+ -+ res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17), -+ params, NULL); -+ -+exit_unlock: -+ spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags); -+ -+ /* -+ * During hibernation, when a CPU is offlined, the kernel tries -+ * to move the interrupt to the remaining CPUs that haven't -+ * been offlined yet. In this case, the below hv_do_hypercall() -+ * always fails since the vmbus channel has been closed: -+ * refer to cpu_disable_common() -> fixup_irqs() -> -+ * irq_migrate_all_off_this_cpu() -> migrate_one_irq(). -+ * -+ * Suppress the error message for hibernation because the failure -+ * during hibernation does not matter (at this time all the devices -+ * have been frozen). Note: the correct affinity info is still updated -+ * into the irqdata data structure in migrate_one_irq() -> -+ * irq_do_set_affinity() -> hv_set_affinity(), so later when the VM -+ * resumes, hv_pci_restore_msi_state() is able to correctly restore -+ * the interrupt with the correct affinity. -+ */ -+ if (!hv_result_success(res) && hbus->state != hv_pcibus_removing) -+ dev_err(&hbus->hdev->device, -+ "%s() failed: %#llx", __func__, res); -+} - #elif defined(CONFIG_ARM64) - /* - * SPI vectors to use for vPCI; arch SPIs range is [32, 1019], but leaving a bit -@@ -841,6 +959,12 @@ static struct irq_domain *hv_pci_get_root_domain(void) - { - return hv_msi_gic_irq_domain; - } -+ -+/* -+ * SPIs are used for interrupts of PCI devices and SPIs is managed via GICD -+ * registers which Hyper-V already supports, so no hypercall needed. -+ */ -+static void hv_arch_irq_unmask(struct irq_data *data) { } - #endif /* CONFIG_ARM64 */ - - /** -@@ -1462,122 +1586,9 @@ static void hv_irq_mask(struct irq_data *data) - irq_chip_mask_parent(data); - } - --/** -- * hv_irq_unmask() - "Unmask" the IRQ by setting its current -- * affinity. -- * @data: Describes the IRQ -- * -- * Build new a destination for the MSI and make a hypercall to -- * update the Interrupt Redirection Table. "Device Logical ID" -- * is built out of this PCI bus's instance GUID and the function -- * number of the device. -- */ - static void hv_irq_unmask(struct irq_data *data) - { -- struct msi_desc *msi_desc = irq_data_get_msi_desc(data); -- struct hv_retarget_device_interrupt *params; -- struct tran_int_desc *int_desc; -- struct hv_pcibus_device *hbus; -- struct cpumask *dest; -- cpumask_var_t tmp; -- struct pci_bus *pbus; -- struct pci_dev *pdev; -- unsigned long flags; -- u32 var_size = 0; -- int cpu, nr_bank; -- u64 res; -- -- dest = irq_data_get_effective_affinity_mask(data); -- pdev = msi_desc_to_pci_dev(msi_desc); -- pbus = pdev->bus; -- hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata); -- int_desc = data->chip_data; -- -- spin_lock_irqsave(&hbus->retarget_msi_interrupt_lock, flags); -- -- params = &hbus->retarget_msi_interrupt_params; -- memset(params, 0, sizeof(*params)); -- params->partition_id = HV_PARTITION_ID_SELF; -- params->int_entry.source = HV_INTERRUPT_SOURCE_MSI; -- params->int_entry.msi_entry.address.as_uint32 = int_desc->address & 0xffffffff; -- params->int_entry.msi_entry.data.as_uint32 = int_desc->data; -- params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | -- (hbus->hdev->dev_instance.b[4] << 16) | -- (hbus->hdev->dev_instance.b[7] << 8) | -- (hbus->hdev->dev_instance.b[6] & 0xf8) | -- PCI_FUNC(pdev->devfn); -- params->int_target.vector = hv_msi_get_int_vector(data); -- -- /* -- * Honoring apic->delivery_mode set to APIC_DELIVERY_MODE_FIXED by -- * setting the HV_DEVICE_INTERRUPT_TARGET_MULTICAST flag results in a -- * spurious interrupt storm. Not doing so does not seem to have a -- * negative effect (yet?). -- */ -- -- if (hbus->protocol_version >= PCI_PROTOCOL_VERSION_1_2) { -- /* -- * PCI_PROTOCOL_VERSION_1_2 supports the VP_SET version of the -- * HVCALL_RETARGET_INTERRUPT hypercall, which also coincides -- * with >64 VP support. -- * ms_hyperv.hints & HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED -- * is not sufficient for this hypercall. -- */ -- params->int_target.flags |= -- HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET; -- -- if (!alloc_cpumask_var(&tmp, GFP_ATOMIC)) { -- res = 1; -- goto exit_unlock; -- } -- -- cpumask_and(tmp, dest, cpu_online_mask); -- nr_bank = cpumask_to_vpset(¶ms->int_target.vp_set, tmp); -- free_cpumask_var(tmp); -- -- if (nr_bank <= 0) { -- res = 1; -- goto exit_unlock; -- } -- -- /* -- * var-sized hypercall, var-size starts after vp_mask (thus -- * vp_set.format does not count, but vp_set.valid_bank_mask -- * does). -- */ -- var_size = 1 + nr_bank; -- } else { -- for_each_cpu_and(cpu, dest, cpu_online_mask) { -- params->int_target.vp_mask |= -- (1ULL << hv_cpu_number_to_vp_number(cpu)); -- } -- } -- -- res = hv_do_hypercall(HVCALL_RETARGET_INTERRUPT | (var_size << 17), -- params, NULL); -- --exit_unlock: -- spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags); -- -- /* -- * During hibernation, when a CPU is offlined, the kernel tries -- * to move the interrupt to the remaining CPUs that haven't -- * been offlined yet. In this case, the below hv_do_hypercall() -- * always fails since the vmbus channel has been closed: -- * refer to cpu_disable_common() -> fixup_irqs() -> -- * irq_migrate_all_off_this_cpu() -> migrate_one_irq(). -- * -- * Suppress the error message for hibernation because the failure -- * during hibernation does not matter (at this time all the devices -- * have been frozen). Note: the correct affinity info is still updated -- * into the irqdata data structure in migrate_one_irq() -> -- * irq_do_set_affinity() -> hv_set_affinity(), so later when the VM -- * resumes, hv_pci_restore_msi_state() is able to correctly restore -- * the interrupt with the correct affinity. -- */ -- if (!hv_result_success(res) && hbus->state != hv_pcibus_removing) -- dev_err(&hbus->hdev->device, -- "%s() failed: %#llx", __func__, res); -+ hv_arch_irq_unmask(data); - - if (data->parent_data->chip->irq_unmask) - irq_chip_unmask_parent(data); --- -2.34.1 - diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0007-PCI-hv-Remove-unused-hv_set_msi_entry_from_desc.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0007-PCI-hv-Remove-unused-hv_set_msi_entry_from_desc.patch deleted file mode 100644 index 4fb50b3db4..0000000000 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0007-PCI-hv-Remove-unused-hv_set_msi_entry_from_desc.patch +++ /dev/null @@ -1,50 +0,0 @@ -From d840bda57a70e672dcd2d5adbac5ef1f76c3082a Mon Sep 17 00:00:00 2001 -From: YueHaibing -Date: Thu, 17 Mar 2022 16:51:30 +0800 -Subject: [PATCH 7/7] PCI: hv: Remove unused hv_set_msi_entry_from_desc() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Fix the following build error: - - drivers/pci/controller/pci-hyperv.c:769:13: error: ‘hv_set_msi_entry_from_desc’ defined but not used [-Werror=unused-function] - 769 | static void hv_set_msi_entry_from_desc(union hv_msi_entry *msi_entry, - -The arm64 implementation of hv_set_msi_entry_from_desc() is not used after -d06957d7a692 ("PCI: hv: Avoid the retarget interrupt hypercall in -irq_unmask() on ARM64"), so remove it. - -Fixes: d06957d7a692 ("PCI: hv: Avoid the retarget interrupt hypercall in irq_unmask() on ARM64") -Link: https://lore.kernel.org/r/20220317085130.36388-1-yuehaibing@huawei.com -Signed-off-by: YueHaibing -Signed-off-by: Bjorn Helgaas -Reviewed-by: Nathan Chancellor -Acked-by: Boqun Feng -(cherry picked from commit 22ef7ee3eeb2a41e07f611754ab9a2663232fedf) ---- - drivers/pci/controller/pci-hyperv.c | 8 -------- - 1 file changed, 8 deletions(-) - -diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c -index 165dfb98d3d8..2db98b4fbc1f 100644 ---- a/drivers/pci/controller/pci-hyperv.c -+++ b/drivers/pci/controller/pci-hyperv.c -@@ -771,14 +771,6 @@ static unsigned int hv_msi_get_int_vector(struct irq_data *irqd) - return irqd->parent_data->hwirq; - } - --static void hv_set_msi_entry_from_desc(union hv_msi_entry *msi_entry, -- struct msi_desc *msi_desc) --{ -- msi_entry->address = ((u64)msi_desc->msg.address_hi << 32) | -- msi_desc->msg.address_lo; -- msi_entry->data = msi_desc->msg.data; --} -- - /* - * @nr_bm_irqs: Indicates the number of IRQs that were allocated from - * the bitmap. --- -2.34.1 - diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/6.1/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch similarity index 78% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/6.1/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch index e82a1e084f..3a2a63e6a9 100644 --- a/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/5.15/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch +++ b/sdk_container/src/third_party/coreos-overlay/sys-kernel/coreos-sources/files/6.1/z0001-kbuild-derive-relative-path-for-srctree-from-CURDIR.patch @@ -1,7 +1,7 @@ -From 5ae7cedb969c1a392e29653e7a1275ee5ffa9e50 Mon Sep 17 00:00:00 2001 +From dcf70e8275cf5cc964a0657312af9210996ae2e7 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Wed, 25 Nov 2015 02:59:45 -0800 -Subject: [PATCH 1/7] kbuild: derive relative path for srctree from CURDIR +Subject: [PATCH] kbuild: derive relative path for srctree from CURDIR This enables relocating source and build trees to different roots, provided they stay reachable relative to one another. Useful for @@ -12,10 +12,10 @@ by some undesirable path component. 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile -index d7ba0de250cb..4da8ba21cab8 100644 +index a5cfcd0a85a9..b81055b65169 100644 --- a/Makefile +++ b/Makefile -@@ -243,8 +243,10 @@ else +@@ -262,8 +262,10 @@ else building_out_of_srctree := 1 endif