smb3: do not reserve too many oplock credits
authorSteve French <stfrench@microsoft.com>
Tue, 20 Jun 2023 03:32:38 +0000 (22:32 -0500)
committerSteve French <stfrench@microsoft.com>
Wed, 21 Jun 2023 04:03:03 +0000 (23:03 -0500)
There were cases reported where servers will sometimes return more
credits than requested on oplock break responses, which can lead to
most of the credits being allocated for oplock breaks (instead of
for normal operations like read and write) if number of SMB3 requests
in flight always stays above 0 (the oplock and echo credits are
rebalanced when in flight requests goes down to zero).

If oplock credits gets unexpectedly large (e.g. three is more than it
would ever be expected to be) and in flight requests are greater than
zero, then rebalance the oplock credits and regular credits (go
back to reserving just one oplock credit).

Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smb2ops.c

index a8bb9d00d33add3629facf919d786821f9b4dc2f..1dc2143ae924cad48dd616f63246181b9c65729d 100644 (file)
@@ -109,7 +109,11 @@ smb2_add_credits(struct TCP_Server_Info *server,
                        server->credits--;
                        server->oplock_credits++;
                }
-       }
+       } else if ((server->in_flight > 0) && (server->oplock_credits > 3) &&
+                  ((optype & CIFS_OP_MASK) == CIFS_OBREAK_OP))
+               /* if now have too many oplock credits, rebalance so don't starve normal ops */
+               change_conf(server);
+
        scredits = *val;
        in_flight = server->in_flight;
        spin_unlock(&server->req_lock);