balance.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /* balance.c
  2. * Balance IRQs.
  3. */
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <sys/types.h>
  8. #include <dirent.h>
  9. #include <limits.h>
  10. #include <ctype.h>
  11. #include "statistics.h"
  12. #include "cpu.h"
  13. #include "irq.h"
  14. static int move_irq_to_cpu(irq_t *irq, cpu_t *cpu)
  15. {
  16. if (!irq || !cpu)
  17. return -1;
  18. if (irq->cpu) {
  19. cpu_t *old_cpu = irq->cpu;
  20. lub_list_node_t *node;
  21. node = lub_list_search(old_cpu->irqs, irq);
  22. if (node) {
  23. lub_list_del(old_cpu->irqs, node);
  24. lub_list_node_free(node);
  25. }
  26. }
  27. lub_list_add(cpu->irqs, irq);
  28. irq->cpu = cpu;
  29. return 0;
  30. }
  31. static cpu_t *choose_cpu(lub_list_t *cpus, irq_t *irq)
  32. {
  33. lub_list_node_t *iter;
  34. lub_list_t * min_cpus = NULL;
  35. float min_load = 100.00;
  36. lub_list_node_t *node;
  37. cpu_t *cpu = NULL;
  38. for (iter = lub_list_iterator_init(cpus); iter;
  39. iter = lub_list_iterator_next(iter)) {
  40. cpu = (cpu_t *)lub_list_node__get_data(iter);
  41. if (!cpu_isset(cpu->id, irq->local_cpus))
  42. continue;
  43. if ((!min_cpus) || (cpu->load < min_load)) {
  44. min_load = cpu->load;
  45. if (!min_cpus)
  46. min_cpus = lub_list_new(cpu_list_compare_len);
  47. while ((node = lub_list__get_tail(min_cpus))) {
  48. lub_list_del(min_cpus, node);
  49. lub_list_node_free(node);
  50. }
  51. lub_list_add(min_cpus, cpu);
  52. }
  53. if (cpu->load == min_load)
  54. lub_list_add(min_cpus, cpu);
  55. }
  56. if (!min_cpus)
  57. return NULL;
  58. node = lub_list__get_head(min_cpus);
  59. cpu = (cpu_t *)lub_list_node__get_data(node);
  60. while ((node = lub_list__get_tail(min_cpus))) {
  61. lub_list_del(min_cpus, node);
  62. lub_list_node_free(node);
  63. }
  64. lub_list_free(min_cpus);
  65. return cpu;
  66. }
  67. int balance(lub_list_t *cpus, lub_list_t *balance_irqs)
  68. {
  69. lub_list_node_t *iter;
  70. for (iter = lub_list_iterator_init(balance_irqs); iter;
  71. iter = lub_list_iterator_next(iter)) {
  72. irq_t *irq;
  73. cpu_t *cpu;
  74. irq = (irq_t *)lub_list_node__get_data(iter);
  75. cpu = choose_cpu(cpus, irq);
  76. if (cpu) {
  77. move_irq_to_cpu(irq, cpu);
  78. printf("Move IRQ %u to CPU%u\n", irq->irq, cpu->id);
  79. }
  80. }
  81. return 0;
  82. }
  83. int apply_affinity(lub_list_t *balance_irqs)
  84. {
  85. lub_list_node_t *iter;
  86. for (iter = lub_list_iterator_init(balance_irqs); iter;
  87. iter = lub_list_iterator_next(iter)) {
  88. irq_t *irq;
  89. irq = (irq_t *)lub_list_node__get_data(iter);
  90. if (!irq->cpu)
  91. continue;
  92. irq_set_affinity(irq, irq->cpu->cpumask);
  93. }
  94. return 0;
  95. }