提交 de1892b8 编写于 作者: S Steve French

Don't delay freeing mids when blocked on slow socket write of request

When processing responses, and in particular freeing mids (DeleteMidQEntry),
which is very important since it also frees the associated buffers (cifs_buf_release),
we can block a long time if (writes to) socket is slow due to low memory or networking
issues.

We can block in send (smb request) waiting for memory, and be blocked in processing
responess (which could free memory if we let it) - since they both grab the
server->srv_mutex.

In practice, in the DeleteMidQEntry case - there is no reason we need to
grab the srv_mutex so remove these around DeleteMidQEntry, and it allows
us to free memory faster.
Signed-off-by: NSteve French <steve.french@primarydata.com>
Acked-by: NPavel Shilovsky <pshilov@microsoft.com>
上级 560d3889
...@@ -697,9 +697,7 @@ cifs_echo_callback(struct mid_q_entry *mid) ...@@ -697,9 +697,7 @@ cifs_echo_callback(struct mid_q_entry *mid)
{ {
struct TCP_Server_Info *server = mid->callback_data; struct TCP_Server_Info *server = mid->callback_data;
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
add_credits(server, 1, CIFS_ECHO_OP); add_credits(server, 1, CIFS_ECHO_OP);
} }
...@@ -1599,9 +1597,7 @@ cifs_readv_callback(struct mid_q_entry *mid) ...@@ -1599,9 +1597,7 @@ cifs_readv_callback(struct mid_q_entry *mid)
} }
queue_work(cifsiod_wq, &rdata->work); queue_work(cifsiod_wq, &rdata->work);
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
add_credits(server, 1, 0); add_credits(server, 1, 0);
} }
...@@ -2058,7 +2054,6 @@ cifs_writev_callback(struct mid_q_entry *mid) ...@@ -2058,7 +2054,6 @@ cifs_writev_callback(struct mid_q_entry *mid)
{ {
struct cifs_writedata *wdata = mid->callback_data; struct cifs_writedata *wdata = mid->callback_data;
struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
struct TCP_Server_Info *server = tcon->ses->server;
unsigned int written; unsigned int written;
WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf;
...@@ -2095,9 +2090,7 @@ cifs_writev_callback(struct mid_q_entry *mid) ...@@ -2095,9 +2090,7 @@ cifs_writev_callback(struct mid_q_entry *mid)
} }
queue_work(cifsiod_wq, &wdata->work); queue_work(cifsiod_wq, &wdata->work);
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
add_credits(tcon->ses->server, 1, 0); add_credits(tcon->ses->server, 1, 0);
} }
......
...@@ -2173,9 +2173,7 @@ smb2_echo_callback(struct mid_q_entry *mid) ...@@ -2173,9 +2173,7 @@ smb2_echo_callback(struct mid_q_entry *mid)
if (mid->mid_state == MID_RESPONSE_RECEIVED) if (mid->mid_state == MID_RESPONSE_RECEIVED)
credits_received = le16_to_cpu(rsp->hdr.sync_hdr.CreditRequest); credits_received = le16_to_cpu(rsp->hdr.sync_hdr.CreditRequest);
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
add_credits(server, credits_received, CIFS_ECHO_OP); add_credits(server, credits_received, CIFS_ECHO_OP);
} }
...@@ -2433,9 +2431,7 @@ smb2_readv_callback(struct mid_q_entry *mid) ...@@ -2433,9 +2431,7 @@ smb2_readv_callback(struct mid_q_entry *mid)
cifs_stats_fail_inc(tcon, SMB2_READ_HE); cifs_stats_fail_inc(tcon, SMB2_READ_HE);
queue_work(cifsiod_wq, &rdata->work); queue_work(cifsiod_wq, &rdata->work);
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
add_credits(server, credits_received, 0); add_credits(server, credits_received, 0);
} }
...@@ -2594,7 +2590,6 @@ smb2_writev_callback(struct mid_q_entry *mid) ...@@ -2594,7 +2590,6 @@ smb2_writev_callback(struct mid_q_entry *mid)
{ {
struct cifs_writedata *wdata = mid->callback_data; struct cifs_writedata *wdata = mid->callback_data;
struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
struct TCP_Server_Info *server = tcon->ses->server;
unsigned int written; unsigned int written;
struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf;
unsigned int credits_received = 1; unsigned int credits_received = 1;
...@@ -2634,9 +2629,7 @@ smb2_writev_callback(struct mid_q_entry *mid) ...@@ -2634,9 +2629,7 @@ smb2_writev_callback(struct mid_q_entry *mid)
cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
queue_work(cifsiod_wq, &wdata->work); queue_work(cifsiod_wq, &wdata->work);
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
add_credits(tcon->ses->server, credits_received, 0); add_credits(tcon->ses->server, credits_received, 0);
} }
......
...@@ -613,9 +613,7 @@ cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server) ...@@ -613,9 +613,7 @@ cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
} }
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
mutex_lock(&server->srv_mutex);
DeleteMidQEntry(mid); DeleteMidQEntry(mid);
mutex_unlock(&server->srv_mutex);
return rc; return rc;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册