From 26a0e6863d7c4292d14877cab7d2b5585f53922c Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 7 Aug 2024 15:09:00 -0400 Subject: [PATCH] Fixes for 5.4 Signed-off-by: Sasha Levin --- ..._chip-registration-functions-to-take.patch | 87 +++++++++++++++++++ ...er-ipset-add-list-flush-to-cancel_gc.patch | 39 +++++++++ queue-5.4/series | 2 + 3 files changed, 128 insertions(+) create mode 100644 queue-5.4/genirq-allow-irq_chip-registration-functions-to-take.patch create mode 100644 queue-5.4/netfilter-ipset-add-list-flush-to-cancel_gc.patch diff --git a/queue-5.4/genirq-allow-irq_chip-registration-functions-to-take.patch b/queue-5.4/genirq-allow-irq_chip-registration-functions-to-take.patch new file mode 100644 index 00000000000..a1a1d4ca78b --- /dev/null +++ b/queue-5.4/genirq-allow-irq_chip-registration-functions-to-take.patch @@ -0,0 +1,87 @@ +From efb701bc04af40c136a7815c4ad20c6ffef584b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Feb 2022 16:25:59 +0000 +Subject: genirq: Allow irq_chip registration functions to take a const + irq_chip + +From: Marc Zyngier + +[ Upstream commit 393e1280f765661cf39785e967676a4e57324126 ] + +In order to let a const irqchip be fed to the irqchip layer, adjust +the various prototypes. An extra cast in irq_set_chip()() is required +to avoid a warning. + +Signed-off-by: Marc Zyngier +Acked-by: Linus Walleij +Link: https://lore.kernel.org/r/20220209162607.1118325-3-maz@kernel.org +Signed-off-by: Sasha Levin +--- + include/linux/irq.h | 7 ++++--- + kernel/irq/chip.c | 9 +++------ + 2 files changed, 7 insertions(+), 9 deletions(-) + +diff --git a/include/linux/irq.h b/include/linux/irq.h +index 5655da9eb1fb9..0c3f153f60670 100644 +--- a/include/linux/irq.h ++++ b/include/linux/irq.h +@@ -677,10 +677,11 @@ extern struct irq_chip no_irq_chip; + extern struct irq_chip dummy_irq_chip; + + extern void +-irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, ++irq_set_chip_and_handler_name(unsigned int irq, const struct irq_chip *chip, + irq_flow_handler_t handle, const char *name); + +-static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip, ++static inline void irq_set_chip_and_handler(unsigned int irq, ++ const struct irq_chip *chip, + irq_flow_handler_t handle) + { + irq_set_chip_and_handler_name(irq, chip, handle, NULL); +@@ -770,7 +771,7 @@ static inline void irq_set_percpu_devid_flags(unsigned int irq) + } + + /* Set/get chip/data for an IRQ: */ +-extern int irq_set_chip(unsigned int irq, struct irq_chip *chip); ++extern int irq_set_chip(unsigned int irq, const struct irq_chip *chip); + extern int irq_set_handler_data(unsigned int irq, void *data); + extern int irq_set_chip_data(unsigned int irq, void *data); + extern int irq_set_irq_type(unsigned int irq, unsigned int type); +diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c +index 498f76beb8766..5f85eac6af11b 100644 +--- a/kernel/irq/chip.c ++++ b/kernel/irq/chip.c +@@ -38,7 +38,7 @@ struct irqaction chained_action = { + * @irq: irq number + * @chip: pointer to irq chip description structure + */ +-int irq_set_chip(unsigned int irq, struct irq_chip *chip) ++int irq_set_chip(unsigned int irq, const struct irq_chip *chip) + { + unsigned long flags; + struct irq_desc *desc = irq_get_desc_lock(irq, &flags, 0); +@@ -46,10 +46,7 @@ int irq_set_chip(unsigned int irq, struct irq_chip *chip) + if (!desc) + return -EINVAL; + +- if (!chip) +- chip = &no_irq_chip; +- +- desc->irq_data.chip = chip; ++ desc->irq_data.chip = (struct irq_chip *)(chip ?: &no_irq_chip); + irq_put_desc_unlock(desc, flags); + /* + * For !CONFIG_SPARSE_IRQ make the irq show up in +@@ -1086,7 +1083,7 @@ irq_set_chained_handler_and_data(unsigned int irq, irq_flow_handler_t handle, + EXPORT_SYMBOL_GPL(irq_set_chained_handler_and_data); + + void +-irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, ++irq_set_chip_and_handler_name(unsigned int irq, const struct irq_chip *chip, + irq_flow_handler_t handle, const char *name) + { + irq_set_chip(irq, chip); +-- +2.43.0 + diff --git a/queue-5.4/netfilter-ipset-add-list-flush-to-cancel_gc.patch b/queue-5.4/netfilter-ipset-add-list-flush-to-cancel_gc.patch new file mode 100644 index 00000000000..74ab2b9af13 --- /dev/null +++ b/queue-5.4/netfilter-ipset-add-list-flush-to-cancel_gc.patch @@ -0,0 +1,39 @@ +From 2daa1f90f88fc206dc6cc76c5a33c16ac23d5e22 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Apr 2024 18:51:41 +0500 +Subject: netfilter: ipset: Add list flush to cancel_gc + +From: Alexander Maltsev + +[ Upstream commit c1193d9bbbd379defe9be3c6de566de684de8a6f ] + +Flushing list in cancel_gc drops references to other lists right away, +without waiting for RCU to destroy list. Fixes race when referenced +ipsets can't be destroyed while referring list is scheduled for destroy. + +Fixes: 97f7cf1cd80e ("netfilter: ipset: fix performance regression in swap operation") +Signed-off-by: Alexander Maltsev +Acked-by: Jozsef Kadlecsik +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/ipset/ip_set_list_set.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c +index 9f4f0126d6ed5..c4aae8c586acf 100644 +--- a/net/netfilter/ipset/ip_set_list_set.c ++++ b/net/netfilter/ipset/ip_set_list_set.c +@@ -547,6 +547,9 @@ list_set_cancel_gc(struct ip_set *set) + + if (SET_WITH_TIMEOUT(set)) + del_timer_sync(&map->gc); ++ ++ /* Flush list to drop references to other ipsets */ ++ list_set_flush(set); + } + + static const struct ip_set_type_variant set_variant = { +-- +2.43.0 + diff --git a/queue-5.4/series b/queue-5.4/series index 403aa9e126c..2ebd43d50b0 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -180,3 +180,5 @@ hid-wacom-modify-pen-ids.patch protect-the-fetch-of-fd-in-do_dup2-from-mispredictions.patch alsa-usb-audio-correct-surround-channels-in-uac1-channel-map.patch net-usb-sr9700-fix-uninitialized-variable-use-in-sr_mdio_read.patch +netfilter-ipset-add-list-flush-to-cancel_gc.patch +genirq-allow-irq_chip-registration-functions-to-take.patch -- 2.47.3