aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifsglob.h
diff options
context:
space:
mode:
authorPavel Shilovsky <piastry@etersoft.ru>2012-02-06 15:59:18 +0400
committerSteve French <sfrench@us.ibm.com>2012-03-21 11:35:03 -0500
commit2d86dbc97094ea4cfc2204fdefd7d07685496189 (patch)
tree9aee614e155fd837c78ded2cd083dead1a9d4a3f /fs/cifs/cifsglob.h
parentCIFS: Simplify inFlight logic (diff)
downloadlinux-dev-2d86dbc97094ea4cfc2204fdefd7d07685496189.tar.xz
linux-dev-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.h11
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;
}
/*