mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
smb: server: remove separate empty_recvmsg_queue
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>
This commit is contained in:
parent
e5cf61fa6e
commit
01027a62b5
|
@ -129,9 +129,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;
|
||||
|
@ -276,32 +273,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)
|
||||
|
@ -386,9 +357,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);
|
||||
|
||||
|
@ -554,7 +522,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;
|
||||
}
|
||||
|
||||
|
@ -568,7 +536,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;
|
||||
|
@ -585,7 +553,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;
|
||||
}
|
||||
|
||||
|
@ -593,7 +561,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;
|
||||
}
|
||||
|
||||
|
@ -613,7 +581,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);
|
||||
|
@ -811,7 +779,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;
|
||||
|
@ -819,18 +786,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;
|
||||
|
@ -1806,8 +1764,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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user