Date: Wed, 22 Aug 2007 21:02:53 +0200 From: "Attilio Rao" <attilio@freebsd.org> To: "Pawel Jakub Dawidek" <pjd@freebsd.org> Cc: Alfred Perlstein <alfred@freebsd.org>, freebsd-arch@freebsd.org Subject: Re: Lockless uidinfo. Message-ID: <3bbf2fe10708221202h44b3258cyf5ca5e9b867ac0e7@mail.gmail.com> In-Reply-To: <20070821202136.GB4187@garage.freebsd.pl> References: <20070818120056.GA6498@garage.freebsd.pl> <20070818155041.GY90381@elvis.mu.org> <20070818161449.GE6498@garage.freebsd.pl> <200708211403.29293.jhb@freebsd.org> <20070821191902.GA4187@garage.freebsd.pl> <20070821202136.GB4187@garage.freebsd.pl>
next in thread | previous in thread | raw e-mail | index | archive | help
2007/8/21, Pawel Jakub Dawidek <pjd@freebsd.org>: > > New patch is here: > > http://people.freebsd.org/~pjd/patches/uidinfo_waitfree.patch --- sys/ia64/include/atomic.h.orig +++ sys/ia64/include/atomic.h @@ -370,4 +370,15 @@ #define atomic_fetchadd_int atomic_fetchadd_32 +static __inline u_long +atomic_fetchadd_long(volatile u_long *p, u_long v) +{ + u_long value; + + do { + value = *p; + } while (!atomic_cmpset_64(p, value, value + v)); + return (value); +} + In cycles like those, as you get spinning, I would arrange things in order to do a cpu_spinwait(). Like this: for (;;) { value = *p; if (atomic_cmpset_64(p, value, value + v)) break; cpu_spinwait(); } Thanks, Attilio -- Peace can only be achieved by understanding - A. Einstein
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3bbf2fe10708221202h44b3258cyf5ca5e9b867ac0e7>