• Haren Myneni's avatar
    powerpc/pseries/vas: Migration suspend waits for no in-progress open windows · 0cf72f7f
    Haren Myneni authored
    The hypervisor returns migration failure if all VAS windows are not
    closed. During pre-migration stage, vas_migration_handler() sets
    migration_in_progress flag and closes all windows from the list.
    The allocate VAS window routine checks the migration flag, setup
    the window and then add it to the list. So there is possibility of
    the migration handler missing the window that is still in the
    process of setup.
    
    t1: Allocate and open VAS	t2: Migration event
        window
    
    lock vas_pseries_mutex
    If migration_in_progress set
      unlock vas_pseries_mutex
      return
    open window HCALL
    unlock vas_pseries_mutex
    Modify window HCALL		lock vas_pseries_mutex
    setup window			migration_in_progress=true
    				Closes all windows from the list
    				// May miss windows that are
    				// not in the list
    				unlock vas_pseries_mutex
    lock vas_pseries_mutex		return
    if nr_closed_windows == 0
      // No DLPAR CPU or migration
      add window to the list
      // Window will be added to the
      // list after the setup is completed
      unlock vas_pseries_mutex
      return
    unlock vas_pseries_mutex
    Close VAS window
    // due to DLPAR CPU or migration
    return -EBUSY
    
    This patch resolves the issue with the following steps:
    - Set the migration_in_progress flag without holding mutex.
    - Introduce nr_open_wins_progress counter in VAS capabilities
      struct
    - This counter tracks the number of open windows are still in
      progress
    - The allocate setup window thread closes windows if the migration
      is set and decrements nr_open_window_progress counter
    - The migration handler waits for no in-progress open windows.
    
    The code flow with the fix is as follows:
    
    t1: Allocate and open VAS       t2: Migration event
        window
    
    lock vas_pseries_mutex
    If migration_in_progress set
       unlock vas_pseries_mutex
       return
    open window HCALL
    nr_open_wins_progress++
    // Window opened, but not
    // added to the list yet
    unlock vas_pseries_mutex
    Modify window HCALL		migration_in_progress=true
    setup window			lock vas_pseries_mutex
    				Closes all windows from the list
    				While nr_open_wins_progress {
    				    unlock vas_pseries_mutex
    lock vas_pseries_mutex		    sleep
    if nr_closed_windows == 0	    // Wait if any open window in
    or migration is not started	    // progress. The open window
       // No DLPAR CPU or migration	    // thread closes the window without
       add window to the list	    // adding to the list and return if
       nr_open_wins_progress--	    // the migration is in progress.
       unlock vas_pseries_mutex
       return
    Close VAS window
    nr_open_wins_progress--
    unlock vas_pseries_mutex
    return -EBUSY			    lock vas_pseries_mutex
    				}
    				unlock vas_pseries_mutex
    				return
    
    Fixes: 37e67648 ("powerpc/pseries/vas: Add VAS migration handler")
    Signed-off-by: default avatarHaren Myneni <haren@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://msgid.link/20231125235104.3405008-1-haren@linux.ibm.com
    0cf72f7f
vas.h 4.21 KB