topology.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/cpu.h>
  3. #include <linux/cpumask.h>
  4. #include <linux/init.h>
  5. #include <linux/node.h>
  6. #include <linux/nodemask.h>
  7. #include <linux/percpu.h>
  8. #include <asm/bootinfo.h>
  9. static DEFINE_PER_CPU(struct cpu, cpu_devices);
  10. #ifdef CONFIG_HOTPLUG_CPU
  11. int arch_register_cpu(int cpu)
  12. {
  13. int ret;
  14. struct cpu *c = &per_cpu(cpu_devices, cpu);
  15. c->hotpluggable = 1;
  16. ret = register_cpu(c, cpu);
  17. if (ret < 0)
  18. pr_warn("register_cpu %d failed (%d)\n", cpu, ret);
  19. return ret;
  20. }
  21. EXPORT_SYMBOL(arch_register_cpu);
  22. void arch_unregister_cpu(int cpu)
  23. {
  24. struct cpu *c = &per_cpu(cpu_devices, cpu);
  25. c->hotpluggable = 0;
  26. unregister_cpu(c);
  27. }
  28. EXPORT_SYMBOL(arch_unregister_cpu);
  29. #endif
  30. static int __init topology_init(void)
  31. {
  32. int i, ret;
  33. for_each_present_cpu(i) {
  34. struct cpu *c = &per_cpu(cpu_devices, i);
  35. c->hotpluggable = !io_master(i);
  36. ret = register_cpu(c, i);
  37. if (ret < 0)
  38. pr_warn("topology_init: register_cpu %d failed (%d)\n", i, ret);
  39. }
  40. return 0;
  41. }
  42. subsys_initcall(topology_init);