diff options
Diffstat (limited to 'debian/patches-rt/of-allocate-free-phandle-cache-outside-of-the-devtre.patch')
-rw-r--r-- | debian/patches-rt/of-allocate-free-phandle-cache-outside-of-the-devtre.patch | 96 |
1 files changed, 0 insertions, 96 deletions
diff --git a/debian/patches-rt/of-allocate-free-phandle-cache-outside-of-the-devtre.patch b/debian/patches-rt/of-allocate-free-phandle-cache-outside-of-the-devtre.patch deleted file mode 100644 index 7469e4fea..000000000 --- a/debian/patches-rt/of-allocate-free-phandle-cache-outside-of-the-devtre.patch +++ /dev/null @@ -1,96 +0,0 @@ -From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> -Date: Fri, 31 Aug 2018 14:16:30 +0200 -Subject: [PATCH] of: allocate / free phandle cache outside of the devtree_lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.2/older/patches-5.2.17-rt9.tar.xz - -The phandle cache code allocates memory while holding devtree_lock which -is a raw_spinlock_t. Memory allocation (and free()) is not possible on -RT while a raw_spinlock_t is held. -Invoke the kfree() and kcalloc() while the lock is dropped. - -Cc: Rob Herring <robh+dt@kernel.org> -Cc: Frank Rowand <frowand.list@gmail.com> -Cc: devicetree@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - drivers/of/base.c | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - ---- a/drivers/of/base.c -+++ b/drivers/of/base.c -@@ -138,31 +138,34 @@ static u32 phandle_cache_mask; - /* - * Caller must hold devtree_lock. - */ --static void __of_free_phandle_cache(void) -+static struct device_node** __of_free_phandle_cache(void) - { - u32 cache_entries = phandle_cache_mask + 1; - u32 k; -+ struct device_node **shadow; - - if (!phandle_cache) -- return; -+ return NULL; - - for (k = 0; k < cache_entries; k++) - of_node_put(phandle_cache[k]); - -- kfree(phandle_cache); -+ shadow = phandle_cache; - phandle_cache = NULL; -+ return shadow; - } - - int of_free_phandle_cache(void) - { - unsigned long flags; -+ struct device_node **shadow; - - raw_spin_lock_irqsave(&devtree_lock, flags); - -- __of_free_phandle_cache(); -+ shadow = __of_free_phandle_cache(); - - raw_spin_unlock_irqrestore(&devtree_lock, flags); -- -+ kfree(shadow); - return 0; - } - #if !defined(CONFIG_MODULES) -@@ -197,10 +200,11 @@ void of_populate_phandle_cache(void) - u32 cache_entries; - struct device_node *np; - u32 phandles = 0; -+ struct device_node **shadow; - - raw_spin_lock_irqsave(&devtree_lock, flags); - -- __of_free_phandle_cache(); -+ shadow = __of_free_phandle_cache(); - - for_each_of_allnodes(np) - if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL) -@@ -208,12 +212,14 @@ void of_populate_phandle_cache(void) - - if (!phandles) - goto out; -+ raw_spin_unlock_irqrestore(&devtree_lock, flags); - - cache_entries = roundup_pow_of_two(phandles); - phandle_cache_mask = cache_entries - 1; - - phandle_cache = kcalloc(cache_entries, sizeof(*phandle_cache), - GFP_ATOMIC); -+ raw_spin_lock_irqsave(&devtree_lock, flags); - if (!phandle_cache) - goto out; - -@@ -225,6 +231,7 @@ void of_populate_phandle_cache(void) - - out: - raw_spin_unlock_irqrestore(&devtree_lock, flags); -+ kfree(shadow); - } - - void __init of_core_init(void) |