Skip to content

Commit 8aa23ba

Browse files
metze-sambasmfrench
authored andcommitted
smb: server: make consitent use of spin_lock_irq{save,restore}() in transport_rdma.c
There is a mix of using spin_lock() and spin_lock_irq(), which is confusing as IB_POLL_WORKQUEUE is used and no code would be called from any interrupt. So using spin_lock() or even mutexes would be ok. But we'll soon share common code with the client, which uses IB_POLL_SOFTIRQ. And Documentation/kernel-hacking/locking.rst section "Cheat Sheet For Locking" says: - Otherwise (== data can be touched in an interrupt), use spin_lock_irqsave() and spin_unlock_irqrestore(). So in order to keep it simple and safe we use that version now. It will help merging functions into common code and have consistent locking in all cases. Acked-by: Namjae Jeon <linkinjeon@kernel.org> Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 0491f26 commit 8aa23ba

1 file changed

Lines changed: 24 additions & 15 deletions

File tree

fs/smb/server/transport_rdma.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -150,21 +150,24 @@ static struct
150150
smbdirect_recv_io *get_free_recvmsg(struct smbdirect_socket *sc)
151151
{
152152
struct smbdirect_recv_io *recvmsg = NULL;
153+
unsigned long flags;
153154

154-
spin_lock(&sc->recv_io.free.lock);
155+
spin_lock_irqsave(&sc->recv_io.free.lock, flags);
155156
if (!list_empty(&sc->recv_io.free.list)) {
156157
recvmsg = list_first_entry(&sc->recv_io.free.list,
157158
struct smbdirect_recv_io,
158159
list);
159160
list_del(&recvmsg->list);
160161
}
161-
spin_unlock(&sc->recv_io.free.lock);
162+
spin_unlock_irqrestore(&sc->recv_io.free.lock, flags);
162163
return recvmsg;
163164
}
164165

165166
static void put_recvmsg(struct smbdirect_socket *sc,
166167
struct smbdirect_recv_io *recvmsg)
167168
{
169+
unsigned long flags;
170+
168171
if (likely(recvmsg->sge.length != 0)) {
169172
ib_dma_unmap_single(sc->ib.dev,
170173
recvmsg->sge.addr,
@@ -173,9 +176,9 @@ static void put_recvmsg(struct smbdirect_socket *sc,
173176
recvmsg->sge.length = 0;
174177
}
175178

176-
spin_lock(&sc->recv_io.free.lock);
179+
spin_lock_irqsave(&sc->recv_io.free.lock, flags);
177180
list_add(&recvmsg->list, &sc->recv_io.free.list);
178-
spin_unlock(&sc->recv_io.free.lock);
181+
spin_unlock_irqrestore(&sc->recv_io.free.lock, flags);
179182

180183
queue_work(sc->workqueue, &sc->recv_io.posted.refill_work);
181184
}
@@ -184,7 +187,9 @@ static void enqueue_reassembly(struct smbdirect_socket *sc,
184187
struct smbdirect_recv_io *recvmsg,
185188
int data_length)
186189
{
187-
spin_lock(&sc->recv_io.reassembly.lock);
190+
unsigned long flags;
191+
192+
spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags);
188193
list_add_tail(&recvmsg->list, &sc->recv_io.reassembly.list);
189194
sc->recv_io.reassembly.queue_length++;
190195
/*
@@ -195,7 +200,7 @@ static void enqueue_reassembly(struct smbdirect_socket *sc,
195200
*/
196201
virt_wmb();
197202
sc->recv_io.reassembly.data_length += data_length;
198-
spin_unlock(&sc->recv_io.reassembly.lock);
203+
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
199204
}
200205

201206
static struct smbdirect_recv_io *get_first_reassembly(struct smbdirect_socket *sc)
@@ -468,14 +473,16 @@ static void free_transport(struct smb_direct_transport *t)
468473

469474
ksmbd_debug(RDMA, "drain the reassembly queue\n");
470475
do {
471-
spin_lock(&sc->recv_io.reassembly.lock);
476+
unsigned long flags;
477+
478+
spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags);
472479
recvmsg = get_first_reassembly(sc);
473480
if (recvmsg) {
474481
list_del(&recvmsg->list);
475-
spin_unlock(&sc->recv_io.reassembly.lock);
482+
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
476483
put_recvmsg(sc, recvmsg);
477484
} else {
478-
spin_unlock(&sc->recv_io.reassembly.lock);
485+
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
479486
}
480487
} while (recvmsg);
481488
sc->recv_io.reassembly.data_length = 0;
@@ -768,6 +775,7 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,
768775
if (sc->recv_io.reassembly.data_length >= size) {
769776
int queue_length;
770777
int queue_removed = 0;
778+
unsigned long flags;
771779

772780
/*
773781
* Need to make sure reassembly_data_length is read before
@@ -823,9 +831,9 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,
823831
if (queue_length) {
824832
list_del(&recvmsg->list);
825833
} else {
826-
spin_lock_irq(&sc->recv_io.reassembly.lock);
834+
spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags);
827835
list_del(&recvmsg->list);
828-
spin_unlock_irq(&sc->recv_io.reassembly.lock);
836+
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
829837
}
830838
queue_removed++;
831839
put_recvmsg(sc, recvmsg);
@@ -838,10 +846,10 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,
838846
data_read += to_copy;
839847
}
840848

841-
spin_lock_irq(&sc->recv_io.reassembly.lock);
849+
spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags);
842850
sc->recv_io.reassembly.data_length -= data_read;
843851
sc->recv_io.reassembly.queue_length -= queue_removed;
844-
spin_unlock_irq(&sc->recv_io.reassembly.lock);
852+
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
845853

846854
sc->recv_io.reassembly.first_entry_offset = offset;
847855
ksmbd_debug(RDMA,
@@ -2107,6 +2115,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
21072115
struct smbdirect_socket_parameters *sp = &sc->parameters;
21082116
struct smbdirect_recv_io *recvmsg;
21092117
struct smbdirect_negotiate_req *req;
2118+
unsigned long flags;
21102119
int ret;
21112120

21122121
/*
@@ -2153,10 +2162,10 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
21532162

21542163
ret = smb_direct_send_negotiate_response(sc, ret);
21552164
out:
2156-
spin_lock_irq(&sc->recv_io.reassembly.lock);
2165+
spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags);
21572166
sc->recv_io.reassembly.queue_length--;
21582167
list_del(&recvmsg->list);
2159-
spin_unlock_irq(&sc->recv_io.reassembly.lock);
2168+
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
21602169
put_recvmsg(sc, recvmsg);
21612170

21622171
return ret;

0 commit comments

Comments
 (0)