[PATCH v2 2/4] livepatch/shadow: Separate code removing all shadow variables for a given id

From: Marcos Paulo de Souza
Date: Wed Oct 26 2022 - 15:41:59 EST


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