• N
    [SCSI] fcoe: Ensure fcoe_recv_frame is always called in process context · 5e70c4c4
    Neil Horman 提交于
    commit 859b7b64 introduced the ability to call
    fcoe_recv_frame in softirq context.  While this is beneficial to performance,
    its not safe to do, as it breaks the serialization of access to the lport
    structure (i.e. when an fcoe interface is being torn down, theres no way to
    serialize the teardown effort with the completion of receieve operations
    occuring in softirq context.  As a result, lport (and other) data structures can
    be read and modified in parallel leading to corruption.  Most notable is the
    vport list, which is protected by a mutex, that will cause a panic if a softirq
    receive while said mutex is locked.  Additionaly, the ema_list, discussed here:
    
    http://lists.open-fcoe.org/pipermail/devel/2012-February/011947.html
    
    Can be corrupted if a list traversal occurs in softirq context at the same time
    as a list delete in process context.  And generally the lport state variables
    will not be stable, and may lead to unpredictable results.
    
    The most direct fix is to remove the bits from the above commit that allowed
    fcoe_recv_frame to be called in softirq context.  We just force all frames to be
    handled by the per-cpu rx threads.  This will allow the fcoe_if_destroy's use of
    fcoe_percpu_clean to function properly, ensuring that no frames are being
    received while the lport is being torn down.
    Signed-off-by: NNeil Horman <nhorman@tuxdriver.com>
    Reviewed-by: NVasu Dev <vasu.dev@intel.com>
    Signed-off-by: NRobert Love <robert.w.love@intel.com>
    Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
    5e70c4c4
fcoe.c 71.3 KB