diff options
author | Pavel Shilovsky <piastry@etersoft.ru> | 2012-02-06 12:59:18 +0100 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2012-03-21 17:35:03 +0100 |
commit | 2d86dbc97094ea4cfc2204fdefd7d07685496189 (patch) | |
tree | 9aee614e155fd837c78ded2cd083dead1a9d4a3f /fs/cifs/cifsglob.h | |
parent | CIFS: Simplify inFlight logic (diff) | |
download | linux-2d86dbc97094ea4cfc2204fdefd7d07685496189.tar.xz linux-2d86dbc97094ea4cfc2204fdefd7d07685496189.zip |
CIFS: Introduce credit-based flow control
and send no more than credits value requests at once. For SMB/CIFS
it's trivial: increment this value by receiving any message and
decrement by sending one.
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/cifsglob.h')
-rw-r--r-- | fs/cifs/cifsglob.h | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index fb78bc903887..d55de9684df9 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -250,8 +250,9 @@ struct TCP_Server_Info { bool noblocksnd; /* use blocking sendmsg */ bool noautotune; /* do not autotune send buf sizes */ bool tcp_nodelay; + int credits; /* send no more requests at once */ unsigned int in_flight; /* number of requests on the wire to server */ - spinlock_t req_lock; /* protect the value above */ + spinlock_t req_lock; /* protect the two values above */ struct mutex srv_mutex; struct task_struct *tsk; char server_GUID[16]; @@ -314,12 +315,14 @@ in_flight(struct TCP_Server_Info *server) return num; } -static inline void -dec_in_flight(struct TCP_Server_Info *server) +static inline bool +has_credits(struct TCP_Server_Info *server) { + int num; spin_lock(&server->req_lock); - server->in_flight--; + num = server->credits; spin_unlock(&server->req_lock); + return num > 0; } /* |