Date: Thu, 3 Jan 2002 15:20:14 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: John Baldwin <jhb@FreeBSD.ORG> Cc: Terry Lambert <tlambert2@mindspring.com>, Peter Jeremy <peter.jeremy@alcatel.com.au>, Michal Mertl <mime@traveller.cz>, Bruce Evans <bde@zeta.org.au>, Mike Smith <msmith@FreeBSD.ORG>, Bernd Walter <ticso@cicely8.cicely.de>, arch@FreeBSD.ORG, Alfred Perlstein <bright@mu.org>, Bernd Walter <ticso@cicely9.cicely.de> Subject: Re: When to use atomic_ functions? (was: 64 bit counters) Message-ID: <200201032320.g03NKEE73347@apollo.backplane.com> References: <XFMail.020103145704.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
There are a number of ways to do queue management without the use of mutexes or locks or critical sections. The easiest is to use a fixed length FIFO with a separate read and write index. struct { struct foo *fifo[64]; int read_index; int filler[(cacheline calculation)]; int write_index; int filler[(cacheline calculation)]; } Foo; If there is only one reader and one writer, only lazy synchronization is necessary and no locks or mutexes are necessary at all. If there are multiple readers or multiple writers then it is possible to use cmpexg type instructions and still avoid any locks or mutexes, though in this case it is easier to simply use a mutex. For example, if we have a per-cpu queue of pending interrupts our interrupt handler can 'write' to the queue without any sort of synchronization, mutexes, or locks, and other (idle or in-scheduler) cpu's may compete to read from the queue by obtaining a mutex. -Matt To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200201032320.g03NKEE73347>