kernel/smp: Refactor ICI broadcast/multicast to invoke the current CPU too.
Since the methods now don't just "send", the names are changed also (which is fitting since they're now API-incompatible.) The changes in the TranslationMaps to adopt this fixes a correctness issue: previously TLB invalidations would be done either with or without interrupts enabled depending on how they were invoked. Now, they'll always be done with interrupts disabled. (This is the same fix that was recently done to x86.) The idea with processing the ICIs on the current CPU too is that presumably the other CPUs will take just as much, if not more, time processing the ICI than the sending CPU. So, we might as well do the processing while we wait, rather than before or after. Testing shows this to indeed be the case. On a bare metal i3, kernel map invalidations (with global invalidations always forced) across a boot-to-desktop go from around ~60.8ms cumulative before, to ~51.8ms cumulative after this change. Change-Id: Icd0343d462de7cf11043e6438f47b02f6b88bb8b Reviewed-on: https://review.haiku-os.org/c/haiku/+/10472 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
988ca40b01
commit
7512053757
@@ -82,14 +82,15 @@ status_t smp_init_post_generic_syscalls(void);
|
||||
bool smp_trap_non_boot_cpus(int32 cpu, uint32* rendezVous);
|
||||
void smp_wake_up_non_boot_cpus(void);
|
||||
void smp_cpu_rendezvous(uint32* var);
|
||||
|
||||
void smp_send_ici(int32 targetCPU, int32 message, addr_t data, addr_t data2, addr_t data3,
|
||||
void *data_ptr, uint32 flags);
|
||||
void smp_send_multicast_ici(CPUSet& cpuMask, int32 message, addr_t data,
|
||||
addr_t data2, addr_t data3, void *data_ptr, uint32 flags);
|
||||
void smp_send_broadcast_ici(int32 message, addr_t data, addr_t data2, addr_t data3,
|
||||
void smp_broadcast_ici(int32 message, addr_t data, addr_t data2, addr_t data3,
|
||||
void *data_ptr, uint32 flags);
|
||||
void smp_send_broadcast_ici_interrupts_disabled(int32 currentCPU, int32 message,
|
||||
addr_t data, addr_t data2, addr_t data3, void *data_ptr, uint32 flags);
|
||||
void smp_multicast_ici(const CPUSet& cpuMask, int32 message, addr_t data,
|
||||
addr_t data2, addr_t data3, void *data_ptr, uint32 flags);
|
||||
void smp_multicast_ici_interrupts_disabled(int32 currentCPU, const CPUSet& cpuMask,
|
||||
int32 message, addr_t data, addr_t data2, addr_t data3, void *data_ptr, uint32 flags);
|
||||
|
||||
int32 smp_get_num_cpus(void);
|
||||
void smp_set_num_cpus(int32 numCPUs);
|
||||
|
||||
Reference in New Issue
Block a user