Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Jul 1998 11:10:31 -0400
From:      sbabkin@dcn.att.com
To:        hackers@FreeBSD.ORG
Subject:   MP, interlocks and vfs_busy
Message-ID:  <C50B6FBA632FD111AF0F0000C0AD71EEFF8B8E@dcn71.dcn.att.com>

next in thread | raw e-mail | index | archive | help
Hi!

I'm reading the VFS code and I don't quite understand the following
piece of code in vfs_busy():

    if (mp->mnt_kern_flag & MNTK_UNMOUNT) {                     
        if (flags & LK_NOWAIT)                                  
            return (ENOENT);                                    
        mp->mnt_kern_flag |= MNTK_MWAIT;                        
        if (interlkp) {                                         
            simple_unlock(interlkp);                            
        }                                                       
        /*                                                      
         * Since all busy locks are shared except the exclusive 
         * lock granted when unmounting, the only place that a  
         * wakeup needs to be done is at the release of the     
         * exclusive lock at the end of dounmount.              
         */                                                     
        tsleep((caddr_t)mp, PVFS, "vfs_busy", 0);               
        if (interlkp) {                                         
            simple_lock(interlkp);                              
        }                                                       
        return (ENOENT);                                        
    }                                                           

The interlocks are used for multiprocessor systems, right ? Then what
would be if another
CPU that is holding unmount lock will obtain simple lock and call
wakeup() when our CPU
is running around the comment: in end of simple_unlock() and beginning
of tsleep() ?
Is not it a race condition (of course, with low probablility because
this code will probably
take less time to execute than the code on another CPU, but still a
possible race
condition) ? Must not be the simple lock properly released inside
tsleep(), after adding
a request to sleep hash ?

-Sergey

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



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