[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20221026194122.11761-3-mpdesouza@suse.com>
Date: Wed, 26 Oct 2022 16:41:20 -0300
From: Marcos Paulo de Souza <mpdesouza@...e.com>
To: linux-kernel@...r.kernel.org, live-patching@...r.kernel.org
Cc: jpoimboe@...hat.com, joe.lawrence@...hat.com, pmladek@...e.com,
Marcos Paulo de Souza <mpdesouza@...e.com>
Subject: [PATCH v2 2/4] livepatch/shadow: Separate code removing all shadow variables for a given id
From: Petr Mladek <pmladek@...e.com>
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@...e.com>
Reviewed-by: Petr Mladek <pmladek@...e.com>
Signed-off-by: Marcos Paulo de Souza <mpdesouza@...e.com>
---
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
Powered by blists - more mailing lists