svn commit: r280971 - in head: contrib/ipfilter/tools share/man/man4 sys/contrib/ipfilter/netinet sys/netinet sys/netipsec sys/netpfil/pf

Mateusz Guzik mjguzik at gmail.com
Thu Apr 2 14:23:24 UTC 2015


On Thu, Apr 02, 2015 at 07:58:29AM -0600, Ian Lepore wrote:
> On Thu, 2015-04-02 at 15:51 +0200, Mateusz Guzik wrote:
> > On Thu, Apr 02, 2015 at 04:42:17PM +0300, Gleb Smirnoff wrote:
> > > On Thu, Apr 02, 2015 at 03:37:51PM +0200, Mateusz Guzik wrote:
> > > M> For this particular use-case you never care what CPU you are executing
> > > M> on, you only want to obtain a unique number.
> > > M> 
> > > M> per-cpu counters can serve this purpose no problem, just provide an
> > > M> operation which guarantees to return the new value of the counter it
> > > M> incremented. Should be easily achieved with e.g. just pinning curthread
> > > M> to the cpu it executes on for the duration of inc + fetch.
> > > 
> > > I'd ask to pay attention to this particular email:
> > > 
> > > https://lists.freebsd.org/pipermail/svn-src-head/2015-March/069966.html
> > > 
> > > Just to justify probabilities, risks and countermeasures.
> > > 
> > > For those, who don't believe in theory and prefers practice:
> > > 
> > > https://lists.freebsd.org/pipermail/svn-src-head/2015-March/070091.html
> > > 
> > > Note that Emeric was the one who observed collisions for the ip_id++
> > > code, that we used before.
> > > 
> > 
> > Well in that case this at least deserves a comment in the code. Everyone
> > spotting that counter_u64_add + zpcpu_get will think it's a bug.
> > 
> 
> Because it IS a bug.  That isn't changed by the fact that it works
> reliably on one platform due to what should be an opque implementation
> detail, and works by accident on other platforms (at least until the
> details of their implementations change in the future).
> 
> As soon as somebody sees this code, thinks it's a good way to do things,
> and cut and pastes it into another venue and removes the & 0xffff, it
> just turns into a bug on every platform except amd64.
> 

Well, a thread migrating to another cpu is the standard thing everyone
sees.

Are you referring to the fact that the counter is 64-bit, so 32-bit
arches must perform 2 reads and the thread can be migrated in-between?

Indeed that would look like a solid problem, mitigated 'by accident'
with 0xffff.

I don't feel that strongly about changing the code. If it stays as it
is, it definitely needs the comment I mentioned explaining why migration
is fine.

If the code was to be changed a machdep counter_u64_fetchadd seems like
the only course of action.

-- 
Mateusz Guzik <mjguzik gmail.com>


More information about the svn-src-head mailing list