[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.2.21.1911141335550.2507@nanos.tec.linutronix.de>
Date: Thu, 14 Nov 2019 13:39:11 +0100 (CET)
From: Thomas Gleixner <tglx@...utronix.de>
To: David Laight <David.Laight@...LAB.COM>
cc: 'Peter Zijlstra' <peterz@...radead.org>,
LKML <linux-kernel@...r.kernel.org>,
"x86@...nel.org" <x86@...nel.org>,
Linus Torvalds <torvalds@...uxfoundation.org>,
Andy Lutomirski <luto@...nel.org>,
Stephen Hemminger <stephen@...workplumber.org>,
Willy Tarreau <w@....eu>, Juergen Gross <jgross@...e.com>,
Sean Christopherson <sean.j.christopherson@...el.com>,
"H. Peter Anvin" <hpa@...or.com>
Subject: RE: [patch V2 11/16] x86/ioperm: Share I/O bitmap if identical
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
Powered by blists - more mailing lists