[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Wed, 11 Nov 2015 19:54:15 +0100
From: Peter Zijlstra <peterz@...radead.org>
To: Alexei Starovoitov <alexei.starovoitov@...il.com>
Cc: David Miller <davem@...emloft.net>, will.deacon@....com,
daniel@...earbox.net, arnd@...db.de, yang.shi@...aro.org,
linaro-kernel@...ts.linaro.org, eric.dumazet@...il.com,
zlim.lnx@...il.com, ast@...nel.org, linux-kernel@...r.kernel.org,
netdev@...r.kernel.org, xi.wang@...il.com, catalin.marinas@....com,
linux-arm-kernel@...ts.infradead.org, yhs@...mgrid.com,
bblanco@...mgrid.com
Subject: Re: [PATCH 2/2] arm64: bpf: add BPF XADD instruction
On Wed, Nov 11, 2015 at 07:44:27PM +0100, Peter Zijlstra wrote:
> On Wed, Nov 11, 2015 at 07:31:28PM +0100, Peter Zijlstra wrote:
> > > Add new one that does 'fetch_and_add' ? What is the real use case it
> > > will be used for?
> >
> > Look at all the atomic_{add,dec}_return*() users in the kernel. A typical
> > example would be a reader-writer lock implementations. See
> > include/asm-generic/rwsem.h for examples.
>
> Maybe a better example would be refcounting, where you free on 0.
>
> if (!fetch_add(&obj->ref, -1))
> free(obj);
Urgh, too used to the atomic_add_return(), which returns post op. That
wants to be:
if (fetch_add(&obj->ref, -1) == 1)
free(obj);
Note that I would very much recommend _against_ encoding the post-op
thing in instructions. It works for reversible operations (like add) but
is pointless for irreversible operations (like or).
That is, given or_return(), you cannot reconstruct the state
prior to the operation, so or_return() provides less information than
fetch_or().
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists