cvs commit: src/sys/dev/an if_an.c

Scott Long scottl at samsco.org
Tue Aug 2 18:28:34 GMT 2005


Nate Lawson wrote:
> Maksim Yevmenkin wrote:
> 
>> emax        2005-08-02 16:03:51 UTC
>>
>>   FreeBSD src repository
>>
>>   Modified files:
>>     sys/dev/an           if_an.c   Log:
>>   Do not lock an to check gone flag. Only need to hold the lock to set
>>   the gone flag.
>>     Reviewed by:    imp
>>   MFC after:      1 day
>>     Revision  Changes    Path
>>   1.69      +1 -2      src/sys/dev/an/if_an.c
>>
>>
>> Index: src/sys/dev/an/if_an.c
>> diff -u src/sys/dev/an/if_an.c:1.68 src/sys/dev/an/if_an.c:1.69
>> --- src/sys/dev/an/if_an.c:1.68    Wed Jul 27 21:03:35 2005
>> +++ src/sys/dev/an/if_an.c    Tue Aug  2 16:03:51 2005
>> @@ -826,12 +826,11 @@
>>      struct an_softc        *sc = device_get_softc(dev);
>>      struct ifnet        *ifp = sc->an_ifp;
>>  
>> -    AN_LOCK(sc);
>>      if (sc->an_gone) {
>> -        AN_UNLOCK(sc);
>>          device_printf(dev,"already unloaded\n");
>>          return(0);
>>      }
>> +    AN_LOCK(sc);
>>      an_stop(sc);
>>      sc->an_gone = 1;
>>      ifmedia_removeall(&sc->an_ifmedia);
> 
> 
> This commit is wrong.  The race is:
> 
> Process 1              Process 2
> an_detach()
> if (gone) ...
>                        an_detach()
>                        if (gone) ...
>                        LOCK
>                        an_stop()
>                        gone = 1
>                        UNLOCK
> LOCK
> an_stop() !!! called twice
> gone = 1
> 
> You really need to hold the lock over both the check and set, otherwise 
> it's not atomic.
> 
> This driver also needs some mtx_asserts in an_reset() and other places 
> that must be called with the an lock held.
> 

I agree with Nate.  The single act of testing an integer usually doesn't 
require a mutex, but making a decision based on that test requires 
atomicity.  I apologize for not noticing this is prior email.

Scott


More information about the cvs-all mailing list