RE: [patch V2 11/16] x86/ioperm: Share I/O bitmap if identical

From: Thomas Gleixner
Date: Thu Nov 14 2019 - 07:39:24 EST


On Thu, 14 Nov 2019, David Laight wrote:
> From: Peter Zijlstra
> > Sent: 12 November 2019 09:15
> ...
> > > + /*
> > > + * If the bitmap is not shared, then nothing can take a refcount as
> > > + * current can obviously not fork at the same time. If it's shared
> > > + * duplicate it and drop the refcount on the original one.
> > > + */
> > > + if (refcount_read(&iobm->refcnt) > 1) {
> > > + iobm = kmemdup(iobm, sizeof(*iobm), GFP_KERNEL);
> > > + if (!iobm)
> > > + return -ENOMEM;
> > > + io_bitmap_exit();
> > refcount_set(&iobm->refcnt, 1);
> > > }
>
> What happens if two threads of the same process enter the above
> at the same time?
> (I've not looked for a lock, but since kmemdup() can sleep I'd suspect there isn't one.)
>
> Also can another thread call fork() - eg while the kmemdup() is sleeping?

That's not a problem at all. The io bitmap which is duplicated can neither
be modified nor freed while the duplication is in progress. That's what the
refcount is for. The threads drop their refcount _after_ duplication.

And fork is not a problem either because that just increments the refcount.

Thanks,

tglx