All of lore.kernel.org
 help / color / mirror / Atom feed
* Atomic Limit Counter Add and Subtract, and QQ about goto
@ 2025-01-18 20:49 Leonardo Brás
  2025-01-18 20:52 ` Leonardo Brás
  0 siblings, 1 reply; 3+ messages in thread
From: Leonardo Brás @ 2025-01-18 20:49 UTC (permalink / raw)
  To: paulmck, perfbook

Hi Paul,

I was reading the Counting Chapter in detail, and the QQ about avoiding a Goto
got my attention:

Listing 5.13: Atomic Limit Counter Add and Subtract
Quick Quiz 5.43: Yecch! Why the ugly goto on line 11 of
Listing 5.13? Haven’t you heard of the break statement???

And I was thinking on an alternate solution to those, by calling slowpath as a
function in this simple change:

```
inline int add_count_slowpath(unsigned long delta)
{
	spin_lock(&gblcnt_mutex);
	globalize_count();

	if (globalcountmax - globalcount - globalreserve < delta) {
		flush_local_count();
		if (globalcountmax - globalcount - globalreserve < delta) {
			spin_unlock(&gblcnt_mutex);
			return 0;
		}
	}

	globalcount += delta;
	balance_count();
	spin_unlock(&gblcnt_mutex);
	return 1;
}


int add_count(unsigned long delta)
{
	int c;
	int cm;
	int old;
	int new;

	do {
		split_counterandmax(&counterandmax, &old, &c, &cm);
		if (delta > MAX_COUNTERMAX || c + delta > cm)
			return add_count_slowpath(delta);
		new = merge_counterandmax(c + delta, cm);	
	 while (atomic_cmpxchg(&counterandmax, old, new) != old);

	return 1;

}
```

Does it make sense?
Does it introduce any overhead I couldn't see?

Thanks!
Leo



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-01-19 17:22 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-18 20:49 Atomic Limit Counter Add and Subtract, and QQ about goto Leonardo Brás
2025-01-18 20:52 ` Leonardo Brás
2025-01-19 17:22   ` Paul E. McKenney

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.