lkml.org 
[lkml]   [2020]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 07/15] ibmvnic: Harden device login requests
    Date
    From: Thomas Falcon <tlfalcon@linux.ibm.com>

    [ Upstream commit dff515a3e71dc8ab3b9dcc2e23a9b5fca88b3c18 ]

    The VNIC driver's "login" command sequence is the final step
    in the driver's initialization process with device firmware,
    confirming the available device queue resources to be utilized
    by the driver. Under high system load, firmware may not respond
    to the request in a timely manner or may abort the request. In
    such cases, the driver should reattempt the login command
    sequence. In case of a device error, the number of retries
    is bounded.

    Signed-off-by: Thomas Falcon <tlfalcon@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/ibm/ibmvnic.c | 21 +++++++++++++++++----
    1 file changed, 17 insertions(+), 4 deletions(-)

    diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
    index 645298628b6f7..5e9e45befc875 100644
    --- a/drivers/net/ethernet/ibm/ibmvnic.c
    +++ b/drivers/net/ethernet/ibm/ibmvnic.c
    @@ -792,12 +792,13 @@ static int ibmvnic_login(struct net_device *netdev)
    struct ibmvnic_adapter *adapter = netdev_priv(netdev);
    unsigned long timeout = msecs_to_jiffies(30000);
    int retry_count = 0;
    + int retries = 10;
    bool retry;
    int rc;

    do {
    retry = false;
    - if (retry_count > IBMVNIC_MAX_QUEUES) {
    + if (retry_count > retries) {
    netdev_warn(netdev, "Login attempts exceeded\n");
    return -1;
    }
    @@ -812,11 +813,23 @@ static int ibmvnic_login(struct net_device *netdev)

    if (!wait_for_completion_timeout(&adapter->init_done,
    timeout)) {
    - netdev_warn(netdev, "Login timed out\n");
    - return -1;
    + netdev_warn(netdev, "Login timed out, retrying...\n");
    + retry = true;
    + adapter->init_done_rc = 0;
    + retry_count++;
    + continue;
    }

    - if (adapter->init_done_rc == PARTIALSUCCESS) {
    + if (adapter->init_done_rc == ABORTED) {
    + netdev_warn(netdev, "Login aborted, retrying...\n");
    + retry = true;
    + adapter->init_done_rc = 0;
    + retry_count++;
    + /* FW or device may be busy, so
    + * wait a bit before retrying login
    + */
    + msleep(500);
    + } else if (adapter->init_done_rc == PARTIALSUCCESS) {
    retry_count++;
    release_sub_crqs(adapter, 1);

    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-23 19:37    [W:3.301 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site