xref: /linux/scripts/atomic/fallbacks/fetch_add_unless (revision ace9bad4df2684f31cbfe8c4ce7a0f5d92b27925)
1*ace9bad4SMark Rutlandcat << EOF
2*ace9bad4SMark Rutland/**
3*ace9bad4SMark Rutland * ${atomic}_fetch_add_unless - add unless the number is already a given value
4*ace9bad4SMark Rutland * @v: pointer of type ${atomic}_t
5*ace9bad4SMark Rutland * @a: the amount to add to v...
6*ace9bad4SMark Rutland * @u: ...unless v is equal to u.
7*ace9bad4SMark Rutland *
8*ace9bad4SMark Rutland * Atomically adds @a to @v, so long as @v was not already @u.
9*ace9bad4SMark Rutland * Returns original value of @v
10*ace9bad4SMark Rutland */
11*ace9bad4SMark Rutlandstatic inline ${int}
12*ace9bad4SMark Rutland${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u)
13*ace9bad4SMark Rutland{
14*ace9bad4SMark Rutland	${int} c = ${atomic}_read(v);
15*ace9bad4SMark Rutland
16*ace9bad4SMark Rutland	do {
17*ace9bad4SMark Rutland		if (unlikely(c == u))
18*ace9bad4SMark Rutland			break;
19*ace9bad4SMark Rutland	} while (!${atomic}_try_cmpxchg(v, &c, c + a));
20*ace9bad4SMark Rutland
21*ace9bad4SMark Rutland	return c;
22*ace9bad4SMark Rutland}
23*ace9bad4SMark RutlandEOF
24