• Viresh Kumar's avatar
    cpufreq: Stop migrating sysfs files on hotplug · 87549141
    Viresh Kumar authored
    When we hot-unplug a cpu, we remove its sysfs cpufreq directory and if
    the outgoing cpu was the owner of policy->kobj earlier then we migrate
    the sysfs directory to under another online cpu.
    
    There are few disadvantages this brings:
    - Code Complexity
    - Slower hotplug/suspend/resume
    - sysfs file permissions are reset after all policy->cpus are offlined
    - CPUFreq stats history lost after all policy->cpus are offlined
    - Special management of sysfs stuff during suspend/resume
    
    To overcome these, this patch modifies the way sysfs directories are
    managed:
    - Select sysfs kobjects owner while initializing policy and don't change
      it during hotplugs. Track it with kobj_cpu created earlier.
    
    - Create symlinks for all related CPUs (can be offline) instead of
      affected CPUs on policy initialization and remove them only when the
      policy is freed.
    
    - Free policy structure only on the removal of cpufreq-driver and not
      during hotplug/suspend/resume, detected by checking 'struct
      subsys_interface *' (Valid only when called from
      subsys_interface_unregister() while unregistering driver).
    
    Apart from this, special care is taken to handle physical hoplug of CPUs
    as we wouldn't remove sysfs links or remove policies on logical
    hotplugs. Physical hotplug happens in the following sequence.
    
    Hot removal:
    - CPU is offlined first, ~ 'echo 0 >
      /sys/devices/system/cpu/cpuX/online'
    - Then its device is removed along with all sysfs files, cpufreq core
      notified with cpufreq_remove_dev() callback from subsys-interface..
    
    Hot addition:
    - First the device along with its sysfs files is added, cpufreq core
      notified with cpufreq_add_dev() callback from subsys-interface..
    - CPU is onlined, ~ 'echo 1 > /sys/devices/system/cpu/cpuX/online'
    
    We call the same routines with both hotplug and subsys callbacks, and we
    sense physical hotplug with cpu_offline() check in subsys callback. We
    can handle most of the stuff with regular hotplug callback paths and
    add/remove cpufreq sysfs links or free policy from subsys callbacks.
    Original-by: default avatarSaravana Kannan <skannan@codeaurora.org>
    Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    87549141
cpufreq.c 67.4 KB