• Julian Wiedmann's avatar
    s390/qeth: strictly order bridge address events · 9d6a569a
    Julian Wiedmann authored
    The current code for bridge address events has two shortcomings in its
    control sequence:
    
    1. after disabling address events via PNSO, we don't flush the remaining
       events from the event_wq. So if the feature is re-enabled fast
       enough, stale events could leak over.
    2. PNSO and the events' arrival via the READ ccw device are unordered.
       So even if we flushed the workqueue, it's difficult to say whether
       the READ device might produce more events onto the workqueue
       afterwards.
    
    Fix this by
    1. explicitly fencing off the events when we no longer care, in the
       READ device's event handler. This ensures that once we flush the
       workqueue, it doesn't get additional address events.
    2. Flush the workqueue after disabling the events & fencing them off.
       As the code that triggers the flush will typically hold the sbp_lock,
       we need to rework the worker code to avoid a deadlock here in case
       of a 'notifications-stopped' event. In case of lock contention,
       requeue such an event with a delay. We'll eventually aquire the lock,
       or spot that the feature has been disabled and the event can thus be
       discarded.
    
    This leaves the theoretical race that a stale event could arrive
    _after_ we re-enabled ourselves to receive events again. Such an event
    would be impossible to distinguish from a 'good' event, nothing we can
    do about it.
    Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
    Reviewed-by: default avatarAlexandra Winter <wintera@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9d6a569a
qeth_l2_main.c 53.5 KB