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