mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
smb: server: remove separate empty_recvmsg_queue
[ Upstream commit 01027a62b508c48c762096f347de925eedcbd008 ]
There's no need to maintain two lists, we can just
have a single list of receive buffers, which are free to use.
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Fixes: 0626e6641f ("cifsd: add server handler for central processing and tranport layers")
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2e4463f44e
commit
28db0cb8a0
@@ -128,9 +128,6 @@ struct smb_direct_transport {
|
||||
spinlock_t recvmsg_queue_lock;
|
||||
struct list_head recvmsg_queue;
|
||||
|
||||
spinlock_t empty_recvmsg_queue_lock;
|
||||
struct list_head empty_recvmsg_queue;
|
||||
|
||||
int send_credit_target;
|
||||
atomic_t send_credits;
|
||||
spinlock_t lock_new_recv_credits;
|
||||
@@ -275,32 +272,6 @@ static void put_recvmsg(struct smb_direct_transport *t,
|
||||
spin_unlock(&t->recvmsg_queue_lock);
|
||||
}
|
||||
|
||||
static struct
|
||||
smb_direct_recvmsg *get_empty_recvmsg(struct smb_direct_transport *t)
|
||||
{
|
||||
struct smb_direct_recvmsg *recvmsg = NULL;
|
||||
|
||||
spin_lock(&t->empty_recvmsg_queue_lock);
|
||||
if (!list_empty(&t->empty_recvmsg_queue)) {
|
||||
recvmsg = list_first_entry(&t->empty_recvmsg_queue,
|
||||
struct smb_direct_recvmsg, list);
|
||||
list_del(&recvmsg->list);
|
||||
}
|
||||
spin_unlock(&t->empty_recvmsg_queue_lock);
|
||||
return recvmsg;
|
||||
}
|
||||
|
||||
static void put_empty_recvmsg(struct smb_direct_transport *t,
|
||||
struct smb_direct_recvmsg *recvmsg)
|
||||
{
|
||||
ib_dma_unmap_single(t->cm_id->device, recvmsg->sge.addr,
|
||||
recvmsg->sge.length, DMA_FROM_DEVICE);
|
||||
|
||||
spin_lock(&t->empty_recvmsg_queue_lock);
|
||||
list_add_tail(&recvmsg->list, &t->empty_recvmsg_queue);
|
||||
spin_unlock(&t->empty_recvmsg_queue_lock);
|
||||
}
|
||||
|
||||
static void enqueue_reassembly(struct smb_direct_transport *t,
|
||||
struct smb_direct_recvmsg *recvmsg,
|
||||
int data_length)
|
||||
@@ -385,9 +356,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
|
||||
spin_lock_init(&t->recvmsg_queue_lock);
|
||||
INIT_LIST_HEAD(&t->recvmsg_queue);
|
||||
|
||||
spin_lock_init(&t->empty_recvmsg_queue_lock);
|
||||
INIT_LIST_HEAD(&t->empty_recvmsg_queue);
|
||||
|
||||
init_waitqueue_head(&t->wait_send_pending);
|
||||
atomic_set(&t->send_pending, 0);
|
||||
|
||||
@@ -553,7 +521,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
wc->opcode);
|
||||
smb_direct_disconnect_rdma_connection(t);
|
||||
}
|
||||
put_empty_recvmsg(t, recvmsg);
|
||||
put_recvmsg(t, recvmsg);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -567,7 +535,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
switch (recvmsg->type) {
|
||||
case SMB_DIRECT_MSG_NEGOTIATE_REQ:
|
||||
if (wc->byte_len < sizeof(struct smb_direct_negotiate_req)) {
|
||||
put_empty_recvmsg(t, recvmsg);
|
||||
put_recvmsg(t, recvmsg);
|
||||
return;
|
||||
}
|
||||
t->negotiation_requested = true;
|
||||
@@ -584,7 +552,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
|
||||
if (wc->byte_len <
|
||||
offsetof(struct smb_direct_data_transfer, padding)) {
|
||||
put_empty_recvmsg(t, recvmsg);
|
||||
put_recvmsg(t, recvmsg);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -592,7 +560,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
if (data_length) {
|
||||
if (wc->byte_len < sizeof(struct smb_direct_data_transfer) +
|
||||
(u64)data_length) {
|
||||
put_empty_recvmsg(t, recvmsg);
|
||||
put_recvmsg(t, recvmsg);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -612,7 +580,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
avail_recvmsg_count = t->count_avail_recvmsg;
|
||||
spin_unlock(&t->receive_credit_lock);
|
||||
} else {
|
||||
put_empty_recvmsg(t, recvmsg);
|
||||
put_recvmsg(t, recvmsg);
|
||||
|
||||
spin_lock(&t->receive_credit_lock);
|
||||
receive_credits = --(t->recv_credits);
|
||||
@@ -810,7 +778,6 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
|
||||
struct smb_direct_recvmsg *recvmsg;
|
||||
int receive_credits, credits = 0;
|
||||
int ret;
|
||||
int use_free = 1;
|
||||
|
||||
spin_lock(&t->receive_credit_lock);
|
||||
receive_credits = t->recv_credits;
|
||||
@@ -818,18 +785,9 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
|
||||
|
||||
if (receive_credits < t->recv_credit_target) {
|
||||
while (true) {
|
||||
if (use_free)
|
||||
recvmsg = get_free_recvmsg(t);
|
||||
else
|
||||
recvmsg = get_empty_recvmsg(t);
|
||||
if (!recvmsg) {
|
||||
if (use_free) {
|
||||
use_free = 0;
|
||||
continue;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvmsg = get_free_recvmsg(t);
|
||||
if (!recvmsg)
|
||||
break;
|
||||
|
||||
recvmsg->type = SMB_DIRECT_MSG_DATA_TRANSFER;
|
||||
recvmsg->first_segment = false;
|
||||
@@ -1805,8 +1763,6 @@ static void smb_direct_destroy_pools(struct smb_direct_transport *t)
|
||||
|
||||
while ((recvmsg = get_free_recvmsg(t)))
|
||||
mempool_free(recvmsg, t->recvmsg_mempool);
|
||||
while ((recvmsg = get_empty_recvmsg(t)))
|
||||
mempool_free(recvmsg, t->recvmsg_mempool);
|
||||
|
||||
mempool_destroy(t->recvmsg_mempool);
|
||||
t->recvmsg_mempool = NULL;
|
||||
|
||||
Reference in New Issue
Block a user