From: Petr Mladek <pmladek@xxxxxxxx> Allow to remove all shadow variables with already taken klp_shadow_lock. It will be needed to synchronize this with other operation during the garbage collection of shadow variables. It is a code refactoring without any functional changes. Signed-off-by: Petr Mladek <pmladek@xxxxxxxx> Reviewed-by: Petr Mladek <pmladek@xxxxxxxx> Signed-off-by: Marcos Paulo de Souza <mpdesouza@xxxxxxxx> --- Changes from v1: * Added my SoB (Josh) kernel/livepatch/shadow.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/kernel/livepatch/shadow.c b/kernel/livepatch/shadow.c index 81ad7cbbd124..aba44dcc0a88 100644 --- a/kernel/livepatch/shadow.c +++ b/kernel/livepatch/shadow.c @@ -283,6 +283,20 @@ void klp_shadow_free(void *obj, unsigned long id, klp_shadow_dtor_t dtor) } EXPORT_SYMBOL_GPL(klp_shadow_free); +static void __klp_shadow_free_all(unsigned long id, klp_shadow_dtor_t dtor) +{ + struct klp_shadow *shadow; + int i; + + lockdep_assert_held(&klp_shadow_lock); + + /* Delete all <*, id> from hash */ + hash_for_each(klp_shadow_hash, i, shadow, node) { + if (klp_shadow_match(shadow, shadow->obj, id)) + klp_shadow_free_struct(shadow, dtor); + } +} + /** * klp_shadow_free_all() - detach and free all <_, id> shadow variables * @id: data identifier @@ -294,18 +308,10 @@ EXPORT_SYMBOL_GPL(klp_shadow_free); */ void klp_shadow_free_all(unsigned long id, klp_shadow_dtor_t dtor) { - struct klp_shadow *shadow; unsigned long flags; - int i; spin_lock_irqsave(&klp_shadow_lock, flags); - - /* Delete all <_, id> from hash */ - hash_for_each(klp_shadow_hash, i, shadow, node) { - if (klp_shadow_match(shadow, shadow->obj, id)) - klp_shadow_free_struct(shadow, dtor); - } - + __klp_shadow_free_all(id, dtor); spin_unlock_irqrestore(&klp_shadow_lock, flags); } EXPORT_SYMBOL_GPL(klp_shadow_free_all); -- 2.37.3