• N
    netpoll: protect napi_poll and poll_controller during dev_[open|close] · ca99ca14
    Neil Horman 提交于
    Ivan Vercera was recently backporting commit
    9c13cb8b to a RHEL kernel, and I noticed that,
    while this patch protects the tg3 driver from having its ndo_poll_controller
    routine called during device initalization, it does nothing for the driver
    during shutdown. I.e. it would be entirely possible to have the
    ndo_poll_controller method (or subsequently the ndo_poll) routine called for a
    driver in the netpoll path on CPU A while in parallel on CPU B, the ndo_close or
    ndo_open routine could be called.  Given that the two latter routines tend to
    initizlize and free many data structures that the former two rely on, the result
    can easily be data corruption or various other crashes.  Furthermore, it seems
    that this is potentially a problem with all net drivers that support netpoll,
    and so this should ideally be fixed in a common path.
    
    As Ben H Pointed out to me, we can't preform dev_open/dev_close in atomic
    context, so I've come up with this solution.  We can use a mutex to sleep in
    open/close paths and just do a mutex_trylock in the napi poll path and abandon
    the poll attempt if we're locked, as we'll just retry the poll on the next send
    anyway.
    
    I've tested this here by flooding netconsole with messages on a system whos nic
    driver I modfied to periodically return NETDEV_TX_BUSY, so that the netpoll tx
    workqueue would be forced to send frames and poll the device.  While this was
    going on I rapidly ifdown/up'ed the interface and watched for any problems.
    I've not found any.
    Signed-off-by: NNeil Horman <nhorman@tuxdriver.com>
    CC: Ivan Vecera <ivecera@redhat.com>
    CC: "David S. Miller" <davem@davemloft.net>
    CC: Ben Hutchings <bhutchings@solarflare.com>
    CC: Francois Romieu <romieu@fr.zoreil.com>
    CC: Eric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    ca99ca14
dev.c 174.7 KB