staticinlinevoid membarrier_arch_switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk)
{ /* * Only need the full barrier when switching between processes. * Barrier when switching from kernel to userspace is not * required here, given that it is implied by mmdrop(). Barrier * when switching from userspace to kernel is not needed after * store to rq->curr.
*/ if (IS_ENABLED(CONFIG_SMP) &&
likely(!(atomic_read(&next->membarrier_state) &
(MEMBARRIER_STATE_PRIVATE_EXPEDITED |
MEMBARRIER_STATE_GLOBAL_EXPEDITED)) || !prev)) return;
/* * The membarrier system call requires a full memory barrier * after storing to rq->curr, before going back to user-space. * * This barrier is also needed for the SYNC_CORE command when * switching between processes; in particular, on a transition * from a thread belonging to another mm to a thread belonging * to the mm for which a membarrier SYNC_CORE is done on CPU0: * * - [CPU0] sets all bits in the mm icache_stale_mask (in * prepare_sync_core_cmd()); * * - [CPU1] stores to rq->curr (by the scheduler); * * - [CPU0] loads rq->curr within membarrier and observes * cpu_rq(1)->curr->mm != mm, so the IPI is skipped on * CPU1; this means membarrier relies on switch_mm() to * issue the sync-core; * * - [CPU1] switch_mm() loads icache_stale_mask; if the bit * is zero, switch_mm() may incorrectly skip the sync-core. * * Matches a full barrier in the proximity of the membarrier * system call entry.
*/
smp_mb();
}
#endif/* _ASM_RISCV_MEMBARRIER_H */
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.