@@ -150,21 +150,24 @@ static struct
150150smbdirect_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
165166static 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
201206static 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 );
21552164out :
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