[xen stable-4.9] stop_machine: fill fn_result only in case of error

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen stable-4.9] stop_machine: fill fn_result only in case of error

patchbot
commit 527fc5c31bb4bda8ec696b5f920ac5174e1535fc
Author:     Gregory Herrero <[hidden email]>
AuthorDate: Mon Aug 28 11:34:26 2017 +0200
Commit:     Jan Beulich <[hidden email]>
CommitDate: Mon Aug 28 11:34:26 2017 +0200

    stop_machine: fill fn_result only in case of error
   
    When stop_machine_run() is called with NR_CPUS as last argument,
    fn_result member must be filled only if an error happens since it is
    shared across all cpus.
   
    Assume CPU1 detects an error and set fn_result to -1, then CPU2 doesn't
    detect an error and set fn_result to 0. The error detected by CPU1 will
    be ignored.
   
    Note that in case multiple failures occur on different CPUs, only the
    last error will be reported.
   
    Signed-off-by: Gregory Herrero <[hidden email]>
    Reviewed-by: Wei Liu <[hidden email]>
    master commit: d8b833d78f6bfde9855a949b5e6d3790d78c0fb7
    master date: 2017-06-01 10:53:04 +0200
---
 xen/common/stop_machine.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/xen/common/stop_machine.c b/xen/common/stop_machine.c
index 304b783..ce6f562 100644
--- a/xen/common/stop_machine.c
+++ b/xen/common/stop_machine.c
@@ -94,6 +94,7 @@ int stop_machine_run(int (*fn)(void *), void *data, unsigned int cpu)
     stopmachine_data.fn_data = data;
     stopmachine_data.nr_cpus = nr_cpus;
     stopmachine_data.fn_cpu = cpu;
+    stopmachine_data.fn_result = 0;
     atomic_set(&stopmachine_data.done, 0);
     stopmachine_data.state = STOPMACHINE_START;
 
@@ -112,7 +113,11 @@ int stop_machine_run(int (*fn)(void *), void *data, unsigned int cpu)
 
     stopmachine_set_state(STOPMACHINE_INVOKE);
     if ( (cpu == smp_processor_id()) || (cpu == NR_CPUS) )
-        stopmachine_data.fn_result = (*fn)(data);
+    {
+        ret = (*fn)(data);
+        if ( ret )
+            write_atomic(&stopmachine_data.fn_result, ret);
+    }
     stopmachine_wait_state();
     ret = stopmachine_data.fn_result;
 
@@ -150,8 +155,12 @@ static void stopmachine_action(unsigned long cpu)
         case STOPMACHINE_INVOKE:
             if ( (stopmachine_data.fn_cpu == smp_processor_id()) ||
                  (stopmachine_data.fn_cpu == NR_CPUS) )
-                stopmachine_data.fn_result =
-                    stopmachine_data.fn(stopmachine_data.fn_data);
+            {
+                int ret = stopmachine_data.fn(stopmachine_data.fn_data);
+
+                if ( ret )
+                    write_atomic(&stopmachine_data.fn_result, ret);
+            }
             break;
         default:
             break;
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.9

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog