]> git.baikalelectronics.ru Git - kernel.git/commit
powerpc/vnic: Extend "failover pending" window
authorSukadev Bhattiprolu <sukadev@linux.ibm.com>
Fri, 30 Oct 2020 17:07:11 +0000 (10:07 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 3 Nov 2020 00:54:04 +0000 (16:54 -0800)
commitb2b99b380b0305532e4c445d3ceb79d751f62b46
treeb513eb5b04a3cdc2ac8af29f2b681c42c1d04b3b
parenta7e477a942db3065c67243bb9639c21a539a6212
powerpc/vnic: Extend "failover pending" window

Commit b2aada4ca6718 introduced the 'failover_pending' state to track
the "failover pending window" - where we wait for the partner to become
ready (after a transport event) before actually attempting to failover.
i.e window is between following two events:

        a. we get a transport event due to a FAILOVER

        b. later, we get CRQ_INITIALIZED indicating the partner is
           ready  at which point we schedule a FAILOVER reset.

and ->failover_pending is true during this window.

If during this window, we attempt to open (or close) a device, we pretend
that the operation succeded and let the FAILOVER reset path complete the
operation.

This is fine, except if the transport event ("a" above) occurs during the
open and after open has already checked whether a failover is pending. If
that happens, we fail the open, which can cause the boot scripts to leave
the interface down requiring administrator to manually bring up the device.

This fix "extends" the failover pending window till we are _actually_
ready to perform the failover reset (i.e until after we get the RTNL
lock). Since open() holds the RTNL lock, we can be sure that we either
finish the open or if the open() fails due to the failover pending window,
we can again pretend that open is done and let the failover complete it.

We could try and block the open until failover is completed but a) that
could still timeout the application and b) Existing code "pretends" that
failover occurred "just after" open succeeded, so marks the open successful
and lets the failover complete the open. So, mark the open successful even
if the transport event occurs before we actually start the open.

Fixes: b2aada4ca671 ("ibmvnic: Fix failover case for non-redundant configuration")
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
Acked-by: Dany Madden <drt@linux.ibm.com>
Link: https://lore.kernel.org/r/20201030170711.1562994-1-sukadev@linux.ibm.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ibm/ibmvnic.c