• Harald Freudenberger's avatar
    s390/ap: Fix hanging ioctl caused by wrong msg counter · e73a99f3
    Harald Freudenberger authored
    When a AP queue is switched to soft offline, all pending
    requests are purged out of the pending requests list and
    'received' by the upper layer like zcrypt device drivers.
    This is also done for requests which are already enqueued
    into the firmware queue. A request in a firmware queue
    may eventually produce an response message, but there is
    no waiting process any more. However, the response was
    counted with the queue_counter and as this counter was
    reset to 0 with the offline switch, the pending response
    caused the queue_counter to get negative. The next request
    increased this counter to 0 (instead of 1) which caused
    the ap code to assume there is nothing to receive and so
    the response for this valid request was never tried to
    fetch from the firmware queue.
    
    This all caused a queue to not work properly after a
    switch offline/online and in the end processes to hang
    forever when trying to send a crypto request after an
    queue offline/online switch cicle.
    
    Fixed by a) making sure the counter does not drop below 0
    and b) on a successful enqueue of a message has at least
    a value of 1.
    
    Additionally a warning is emitted, when a reply can't get
    assigned to a waiting process. This may be normal operation
    (process had timeout or has been killed) but may give a
    hint that something unexpected happened (like this odd
    behavior described above).
    Signed-off-by: default avatarHarald Freudenberger <freude@linux.ibm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    e73a99f3
ap_queue.c 23.2 KB