mach_ipi.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #ifndef __ASM_MACH_IPI_H
  2. #define __ASM_MACH_IPI_H
  3. /* Avoid include hell */
  4. #define NMI_VECTOR 0x02
  5. void send_IPI_mask_bitmask(cpumask_t mask, int vector);
  6. void __send_IPI_shortcut(unsigned int shortcut, int vector);
  7. extern int no_broadcast;
  8. static inline void send_IPI_mask(cpumask_t mask, int vector)
  9. {
  10. send_IPI_mask_bitmask(mask, vector);
  11. }
  12. static inline void __local_send_IPI_allbutself(int vector)
  13. {
  14. if (no_broadcast || vector == NMI_VECTOR) {
  15. cpumask_t mask = cpu_online_map;
  16. cpu_clear(smp_processor_id(), mask);
  17. send_IPI_mask(mask, vector);
  18. } else
  19. __send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
  20. }
  21. static inline void __local_send_IPI_all(int vector)
  22. {
  23. if (no_broadcast || vector == NMI_VECTOR)
  24. send_IPI_mask(cpu_online_map, vector);
  25. else
  26. __send_IPI_shortcut(APIC_DEST_ALLINC, vector);
  27. }
  28. static inline void send_IPI_allbutself(int vector)
  29. {
  30. /*
  31. * if there are no other CPUs in the system then we get an APIC send
  32. * error if we try to broadcast, thus avoid sending IPIs in this case.
  33. */
  34. if (!(num_online_cpus() > 1))
  35. return;
  36. __local_send_IPI_allbutself(vector);
  37. return;
  38. }
  39. static inline void send_IPI_all(int vector)
  40. {
  41. __local_send_IPI_all(vector);
  42. }
  43. #endif /* __ASM_MACH_IPI_H */