Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Aug 2015 19:30:48 -0700
From:      John Baldwin <john@araratriver.co>
To:        freebsd-drivers@freebsd.org
Cc:        Leonardo Fogel <leonardofogel@yahoo.com.br>, 'Konstantin Belousov' <kib@freebsd.org>
Subject:   Re: Race conditions
Message-ID:  <10064388.a9lbzVPoX7@ralph.baldwin.cx>
In-Reply-To: <1439923294.98963.YahooMailBasic@web120801.mail.ne1.yahoo.com>
References:  <1439923294.98963.YahooMailBasic@web120801.mail.ne1.yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday, August 18, 2015 11:41:34 AM Leonardo Fogel wrote:
> Hi.
> The following code is an exerpt from the FreeBSD Architecture Handbook, chapter 11.1.1. Sample Driver Source. I've included labels i1, i2, i3.
> 
>    int
>    mypci_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
>    {
>            struct mypci_softc *sc;
> 
>            /* Look up our softc. */
>    i1:     sc = dev->si_drv1;
>            device_printf(sc->my_dev, "Opened successfully.\n");
>            return (0);
>    }
> 
>    static int
>    mypci_attach(device_t dev)
>    {
>            struct mypci_softc *sc;
>    ...
>    i2:     sc->my_cdev = make_dev(&mypci_cdevsw, device_get_unit(dev),
>                UID_ROOT, GID_WHEEL, 0600, "mypci%u", device_get_unit(dev));
>    i3:     sc->my_cdev->si_drv1 = sc;
>            printf("Mypci device loaded.\n");
>            return (0);
>    }
> 
> 
> As I understand it, as soon as instruction at label i2 completes, there is a rare possibility that another thread opens the device file and executes the instruction at i1, before the instruction at i3 is executed. Is it correct? How could one fix it?

It is a race, yes.  I know there is a MAKEDEV_REF flag that can be passed to
make_dev_p() and make_dev_credf() that can hold a reference on the returned
cdev (so it can't be immediately deleted), but I don't know that that helps
close the race you reference.

I think I would probably prefer we add some sort of wrapper for make_dev
that accepts the si_drv1 value (and possibly other values) as an argument to
close this.  I'm cc'ing kib@ to see if he has any suggestions or better ideas.

-- 
John Baldwin




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?10064388.a9lbzVPoX7>