Skip to content
  • Yasuaki Ishimatsu's avatar
    ACPI / processor: prevent cpu from becoming online · 5e5041f3
    Yasuaki Ishimatsu authored
    
    
    Even if acpi_processor_handle_eject() offlines cpu, there is a chance
    to online the cpu after that. So the patch closes the window by using
    get/put_online_cpus().
    
    Why does the patch change _cpu_up() logic?
    
    The patch cares the race of hot-remove cpu and _cpu_up(). If the patch
    does not change it, there is the following race.
    
    hot-remove cpu                         |  _cpu_up()
    ------------------------------------- ------------------------------------
    call acpi_processor_handle_eject()     |
         call cpu_down()                   |
         call get_online_cpus()            |
                                           | call cpu_hotplug_begin() and stop here
         call arch_unregister_cpu()        |
         call acpi_unmap_lsapic()          |
         call put_online_cpus()            |
                                           | start and continue _cpu_up()
         return acpi_processor_remove()    |
    continue hot-remove the cpu            |
    
    So _cpu_up() can continue to itself. And hot-remove cpu can also continue
    itself. If the patch changes _cpu_up() logic, the race disappears as below:
    
    hot-remove cpu                         | _cpu_up()
    -----------------------------------------------------------------------
    call acpi_processor_handle_eject()     |
         call cpu_down()                   |
         call get_online_cpus()            |
                                           | call cpu_hotplug_begin() and stop here
         call arch_unregister_cpu()        |
         call acpi_unmap_lsapic()          |
              cpu's cpu_present is set     |
              to false by set_cpu_present()|
         call put_online_cpus()            |
                                           | start _cpu_up()
                                           | check cpu_present() and return -EINVAL
         return acpi_processor_remove()    |
    continue hot-remove the cpu            |
    
    Signed-off-by: default avatarYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
    Reviewed-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Reviewed-by: default avatarToshi Kani <toshi.kani@hp.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    5e5041f3