Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Dec 2000 16:21:57 -0800 (PST)
From:      John Baldwin <jhb@FreeBSD.ORG>
To:        Robert Watson <rwatson@FreeBSD.ORG>
Cc:        arch@FreeBSD.ORG
Subject:   Re: Can !curproc touch
Message-ID:  <XFMail.001212162157.jhb@FreeBSD.org>
In-Reply-To: <Pine.NEB.3.96L.1001212165140.62929F-100000@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On 12-Dec-00 Robert Watson wrote:
> 
> My understanding is that a number of systems perform a crcopy() while
> holding the struct proc mutex, and get an additional ucred reference which
> is then passed down the VFS stack, guarantying that the credentials are
> used consistently.  This addresses a number of problems, including the
> multi-threaded case where you want a system call to be processed entirely
> under one set of credentials, serializing requests from the perspective of
> the credential.  The general rule for reference counts should be that the
> holder of the reference count is responsible for protecting it: if the
> owner of the reference is struct proc, then the user of that reference
> must protect struct proc while using the reference.  If the use of the
> reference is relatively long-term, then an additional reference should be
> created and used instead (i.e., crref()), allowing the user to release the
> protection (mutex, lock, invariants, whatever) on the struct proc.  This
> was the type of reference count race condition I was discussing, btw, at
> BSDCon while we were futzing around at the whiteboard discussing drivers
> and related stuff.

Well, currently nothing uses the struct proc mutex when touching p_ucred.  This
is some code from coda:

/*
 * find root of cfs
 */
int
coda_root(vfsp, vpp)
        struct mount *vfsp;
        struct vnode **vpp;
{
    struct coda_mntinfo *mi = vftomi(vfsp);
    struct vnode **result;
    int error;
    struct proc *p = curproc;    /* XXX - bnoble */
    ...
    error = venus_root(vftomi(vfsp), p->p_ucred, p, &VFid);

To fix this I could do this:

    struct ucred *uc;
    ...
    PROC_LOCK(p);
    uc = p->p_ucred;
    crhold(uc);
    PROC_UNLOCK(p);
    error = venus_root(...., uc, ...);
    crfree(uc);

In place of the last line.  However, note that p is always curproc.  If all the
other places that accees p->p_ucred only do so if p == curproc, then I don't
need to use an explicit lock to protect p_ucred, as it will be implicitly
locked.  Thus, my question is is there a place where a process A can read or
write the p_ucred of process B.  If there is, then I need to use the proc mutex
to protect p_ucred.  If not, I can leave p_ucred alone.

-- 

John Baldwin <jhb@FreeBSD.org> -- http://www.FreeBSD.org/~jhb/
PGP Key: http://www.Baldwin.cx/~john/pgpkey.asc
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




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