aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2018-11-01 18:01:44 +0100
committerHauke Mehrtens <hauke@hauke-m.de>2018-12-15 14:28:48 +0100
commit9261e7447ea7b8d33b70ff6ea008f2041a88e255 (patch)
treec9af04326ac9953a33fc8fd3e852c11fc1eb4df3 /target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch
parent52a82ce3dd901a1536c7d7d9d963e9c2d761c816 (diff)
downloadupstream-9261e7447ea7b8d33b70ff6ea008f2041a88e255.tar.gz
upstream-9261e7447ea7b8d33b70ff6ea008f2041a88e255.tar.bz2
upstream-9261e7447ea7b8d33b70ff6ea008f2041a88e255.zip
kernel: Make the patches apply on top of 4.19
This makes the patches which were just copied in the previous commit apply on top of kernel 4.19. The patches in the backports-4.19 folder were checked if they are really in kernel 4.19 based on the title and only removed if they were found in the upstream kernel. The following additional patches form the pending folder went into upstream Linux 4.19: pending-4.19/171-usb-dwc2-Fix-inefficient-copy-of-unaligned-buffers.patch pending-4.19/190-2-5-e1000e-Fix-wrong-comment-related-to-link-detection.patch pending-4.19/478-mtd-spi-nor-Add-support-for-XM25QH64A-and-XM25QH128A.patch pending-4.19/479-mtd-spi-nor-add-eon-en25qh32.patch pending-4.19/950-tty-serial-exar-generalize-rs485-setup.patch pending-4.19/340-MIPS-mm-remove-mips_dma_mapping_error.patch Bigger changes were introduced to the m25p80 spi nor driver, as far as I saw it in the new code, it now has the functionality provided in this patch: pending-4.19/450-mtd-m25p80-allow-fallback-from-spi_flash_read-to-reg.patch Part of this patch went upstream independent of OpenWrt: hack-4.19/220-gc_sections.patch This patch was reworked to match the changes done upstream. The MIPS DMA API changed a lot, this patch was rewritten to match the new DMA handling: pending-4.19/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch I did bigger manual changes to the following patches and I am not 100% sure if they are all correct: pending-4.19/0931-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch pending-4.19/411-mtd-partial_eraseblock_write.patch pending-4.19/600-netfilter_conntrack_flush.patch pending-4.19/611-netfilter_match_bypass_default_table.patch pending-4.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch hack-4.19/211-host_tools_portability.patch hack-4.19/221-module_exports.patch hack-4.19/321-powerpc_crtsavres_prereq.patch hack-4.19/902-debloat_proc.patch This is based on patchset from Marko Ratkaj <marko.ratkaj@sartura.hr> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch')
-rw-r--r--target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch132
1 files changed, 0 insertions, 132 deletions
diff --git a/target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch b/target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch
deleted file mode 100644
index 5eca73552b..0000000000
--- a/target/linux/generic/backport-4.19/292-v4.16-netfilter-core-free-hooks-with-call_rcu.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From 8c873e2199700c2de7dbd5eedb9d90d5f109462b Mon Sep 17 00:00:00 2001
-From: Florian Westphal <fw@strlen.de>
-Date: Fri, 1 Dec 2017 00:21:04 +0100
-Subject: [PATCH 04/11] netfilter: core: free hooks with call_rcu
-
-Giuseppe Scrivano says:
- "SELinux, if enabled, registers for each new network namespace 6
- netfilter hooks."
-
-Cost for this is high. With synchronize_net() removed:
- "The net benefit on an SMP machine with two cores is that creating a
- new network namespace takes -40% of the original time."
-
-This patch replaces synchronize_net+kvfree with call_rcu().
-We store rcu_head at the tail of a structure that has no fixed layout,
-i.e. we cannot use offsetof() to compute the start of the original
-allocation. Thus store this information right after the rcu head.
-
-We could simplify this by just placing the rcu_head at the start
-of struct nf_hook_entries. However, this structure is used in
-packet processing hotpath, so only place what is needed for that
-at the beginning of the struct.
-
-Reported-by: Giuseppe Scrivano <gscrivan@redhat.com>
-Signed-off-by: Florian Westphal <fw@strlen.de>
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
----
- include/linux/netfilter.h | 19 +++++++++++++++----
- net/netfilter/core.c | 34 ++++++++++++++++++++++++++++------
- 2 files changed, 43 insertions(+), 10 deletions(-)
-
---- a/include/linux/netfilter.h
-+++ b/include/linux/netfilter.h
-@@ -77,17 +77,28 @@ struct nf_hook_entry {
- void *priv;
- };
-
-+struct nf_hook_entries_rcu_head {
-+ struct rcu_head head;
-+ void *allocation;
-+};
-+
- struct nf_hook_entries {
- u16 num_hook_entries;
- /* padding */
- struct nf_hook_entry hooks[];
-
-- /* trailer: pointers to original orig_ops of each hook.
-- *
-- * This is not part of struct nf_hook_entry since its only
-- * needed in slow path (hook register/unregister).
-+ /* trailer: pointers to original orig_ops of each hook,
-+ * followed by rcu_head and scratch space used for freeing
-+ * the structure via call_rcu.
- *
-+ * This is not part of struct nf_hook_entry since its only
-+ * needed in slow path (hook register/unregister):
- * const struct nf_hook_ops *orig_ops[]
-+ *
-+ * For the same reason, we store this at end -- its
-+ * only needed when a hook is deleted, not during
-+ * packet path processing:
-+ * struct nf_hook_entries_rcu_head head
- */
- };
-
---- a/net/netfilter/core.c
-+++ b/net/netfilter/core.c
-@@ -74,7 +74,8 @@ static struct nf_hook_entries *allocate_
- struct nf_hook_entries *e;
- size_t alloc = sizeof(*e) +
- sizeof(struct nf_hook_entry) * num +
-- sizeof(struct nf_hook_ops *) * num;
-+ sizeof(struct nf_hook_ops *) * num +
-+ sizeof(struct nf_hook_entries_rcu_head);
-
- if (num == 0)
- return NULL;
-@@ -85,6 +86,30 @@ static struct nf_hook_entries *allocate_
- return e;
- }
-
-+static void __nf_hook_entries_free(struct rcu_head *h)
-+{
-+ struct nf_hook_entries_rcu_head *head;
-+
-+ head = container_of(h, struct nf_hook_entries_rcu_head, head);
-+ kvfree(head->allocation);
-+}
-+
-+static void nf_hook_entries_free(struct nf_hook_entries *e)
-+{
-+ struct nf_hook_entries_rcu_head *head;
-+ struct nf_hook_ops **ops;
-+ unsigned int num;
-+
-+ if (!e)
-+ return;
-+
-+ num = e->num_hook_entries;
-+ ops = nf_hook_entries_get_hook_ops(e);
-+ head = (void *)&ops[num];
-+ head->allocation = e;
-+ call_rcu(&head->head, __nf_hook_entries_free);
-+}
-+
- static unsigned int accept_all(void *priv,
- struct sk_buff *skb,
- const struct nf_hook_state *state)
-@@ -291,9 +316,8 @@ int nf_register_net_hook(struct net *net
- #ifdef HAVE_JUMP_LABEL
- static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]);
- #endif
-- synchronize_net();
- BUG_ON(p == new_hooks);
-- kvfree(p);
-+ nf_hook_entries_free(p);
- return 0;
- }
- EXPORT_SYMBOL(nf_register_net_hook);
-@@ -361,10 +385,8 @@ void nf_unregister_net_hook(struct net *
- if (!p)
- return;
-
-- synchronize_net();
--
- nf_queue_nf_hook_drop(net);
-- kvfree(p);
-+ nf_hook_entries_free(p);
- }
- EXPORT_SYMBOL(nf_unregister_net_hook);
-