• Eric Farman's avatar
    vfio-ccw: Serialize FSM IDLE state with I/O completion · 2af7a834
    Eric Farman authored
    Today, the stacked call to vfio_ccw_sch_io_todo() does three things:
    
      1) Update a solicited IRB with CP information, and release the CP
         if the interrupt was the end of a START operation.
      2) Copy the IRB data into the io_region, under the protection of
         the io_mutex
      3) Reset the vfio-ccw FSM state to IDLE to acknowledge that
         vfio-ccw can accept more work.
    
    The trouble is that step 3 is (A) invoked for both solicited and
    unsolicited interrupts, and (B) sitting after the mutex for step 2.
    This second piece becomes a problem if it processes an interrupt
    for a CLEAR SUBCHANNEL while another thread initiates a START,
    thus allowing the CP and FSM states to get out of sync. That is:
    
        CPU 1                           CPU 2
        fsm_do_clear()
        fsm_irq()
                                        fsm_io_request()
        vfio_ccw_sch_io_todo()
                                        fsm_io_helper()
    
    Since the FSM state and CP should be kept in sync, let's make a
    note when the CP is released, and rely on that as an indication
    that the FSM should also be reset at the end of this routine and
    open up the device for more work.
    Signed-off-by: default avatarEric Farman <farman@linux.ibm.com>
    Acked-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
    Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
    Message-Id: <20210511195631.3995081-4-farman@linux.ibm.com>
    Signed-off-by: default avatarCornelia Huck <cohuck@redhat.com>
    2af7a834
vfio_ccw_drv.c 12.6 KB