Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8add570a authored by Tony Luck's avatar Tony Luck
Browse files

Pull ticket-spinaphore into release branch

parents 48fade6c 883a3acf
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -100,24 +100,36 @@ wrap_mmu_context (struct mm_struct *mm)
 * this primitive it can be moved up to a spinaphore.h header.
 */
struct spinaphore {
	atomic_t	cur;
	unsigned long	ticket;
	unsigned long	serve;
};

static inline void spinaphore_init(struct spinaphore *ss, int val)
{
	atomic_set(&ss->cur, val);
	ss->ticket = 0;
	ss->serve = val;
}

static inline void down_spin(struct spinaphore *ss)
{
	while (unlikely(!atomic_add_unless(&ss->cur, -1, 0)))
		while (atomic_read(&ss->cur) == 0)
	unsigned long t = ia64_fetchadd(1, &ss->ticket, acq), serve;

	if (time_before(t, ss->serve))
		return;

	ia64_invala();

	for (;;) {
		asm volatile ("ld4.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory");
		if (time_before(t, serve))
			return;
		cpu_relax();
	}
}

static inline void up_spin(struct spinaphore *ss)
{
	atomic_add(1, &ss->cur);
	ia64_fetchadd(1, &ss->serve, rel);
}

static struct spinaphore ptcg_sem;