While we are patching, we set up a stub which refers to kgr_in_progress of a process. The stub can be called immediately when set up, but we set the flag even after done with patching in kgr_handle_processes. This is obviously too late, so set the flag before we start patching, but after we check that no other patching is in progress -- we would interfere otherwise.
Signed-off-by: Jiri Slaby <jsl...@suse.cz> Reported-by: Aravinda Prasad <aravi...@linux.vnet.ibm.com> --- kernel/kgraft.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel/kgraft.c b/kernel/kgraft.c index 6816da29a6a3..89414957cf74 100644 --- a/kernel/kgraft.c +++ b/kernel/kgraft.c @@ -124,14 +124,22 @@ static void kgr_work_fn(struct work_struct *work) mutex_unlock(&kgr_in_progress_lock); } -static void kgr_handle_processes(void) +static void kgr_mark_processes(void) { struct task_struct *p; read_lock(&tasklist_lock); - for_each_process(p) { + for_each_process(p) kgr_mark_task_in_progress(p); + read_unlock(&tasklist_lock); +} +static void kgr_handle_processes(void) +{ + struct task_struct *p; + + read_lock(&tasklist_lock); + for_each_process(p) { /* wake up kthreads, they will clean the progress flag */ if (!p->mm) { /* @@ -333,6 +341,8 @@ int kgr_start_patching(struct kgr_patch *patch) goto unlock_free; } + kgr_mark_processes(); + for (patch_fun = patch->patches; *patch_fun; patch_fun++) { ret = kgr_patch_code(patch, *patch_fun, false); /* -- 2.0.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/