@@ -103,6 +103,7 @@ static struct rxrpc_local *rxrpc_alloc_local(struct rxrpc_net *rxnet,
103
103
init_rwsem (& local -> defrag_sem );
104
104
skb_queue_head_init (& local -> reject_queue );
105
105
skb_queue_head_init (& local -> event_queue );
106
+ skb_queue_head_init (& local -> rx_queue );
106
107
local -> client_bundles = RB_ROOT ;
107
108
spin_lock_init (& local -> client_bundles_lock );
108
109
spin_lock_init (& local -> lock );
@@ -126,6 +127,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
126
127
struct udp_tunnel_sock_cfg tuncfg = {NULL };
127
128
struct sockaddr_rxrpc * srx = & local -> srx ;
128
129
struct udp_port_cfg udp_conf = {0 };
130
+ struct task_struct * io_thread ;
129
131
struct sock * usk ;
130
132
int ret ;
131
133
@@ -185,8 +187,23 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
185
187
BUG ();
186
188
}
187
189
190
+ io_thread = kthread_run (rxrpc_io_thread , local ,
191
+ "krxrpcio/%u" , ntohs (udp_conf .local_udp_port ));
192
+ if (IS_ERR (io_thread )) {
193
+ ret = PTR_ERR (io_thread );
194
+ goto error_sock ;
195
+ }
196
+
197
+ local -> io_thread = io_thread ;
188
198
_leave (" = 0" );
189
199
return 0 ;
200
+
201
+ error_sock :
202
+ kernel_sock_shutdown (local -> socket , SHUT_RDWR );
203
+ local -> socket -> sk -> sk_user_data = NULL ;
204
+ sock_release (local -> socket );
205
+ local -> socket = NULL ;
206
+ return ret ;
190
207
}
191
208
192
209
/*
@@ -360,19 +377,8 @@ struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local,
360
377
*/
361
378
void rxrpc_unuse_local (struct rxrpc_local * local , enum rxrpc_local_trace why )
362
379
{
363
- unsigned int debug_id ;
364
- int r , u ;
365
-
366
- if (local ) {
367
- debug_id = local -> debug_id ;
368
- r = refcount_read (& local -> ref );
369
- u = atomic_dec_return (& local -> active_users );
370
- trace_rxrpc_local (debug_id , why , r , u );
371
- if (u == 0 ) {
372
- rxrpc_get_local (local , rxrpc_local_get_queue );
373
- rxrpc_queue_local (local );
374
- }
375
- }
380
+ if (local && __rxrpc_unuse_local (local , why ))
381
+ kthread_stop (local -> io_thread );
376
382
}
377
383
378
384
/*
@@ -382,7 +388,7 @@ void rxrpc_unuse_local(struct rxrpc_local *local, enum rxrpc_local_trace why)
382
388
* Closing the socket cannot be done from bottom half context or RCU callback
383
389
* context because it might sleep.
384
390
*/
385
- static void rxrpc_local_destroyer (struct rxrpc_local * local )
391
+ void rxrpc_destroy_local (struct rxrpc_local * local )
386
392
{
387
393
struct socket * socket = local -> socket ;
388
394
struct rxrpc_net * rxnet = local -> rxnet ;
@@ -411,6 +417,7 @@ static void rxrpc_local_destroyer(struct rxrpc_local *local)
411
417
*/
412
418
rxrpc_purge_queue (& local -> reject_queue );
413
419
rxrpc_purge_queue (& local -> event_queue );
420
+ rxrpc_purge_queue (& local -> rx_queue );
414
421
}
415
422
416
423
/*
@@ -430,10 +437,8 @@ static void rxrpc_local_processor(struct work_struct *work)
430
437
431
438
do {
432
439
again = false;
433
- if (!__rxrpc_use_local (local , rxrpc_local_use_work )) {
434
- rxrpc_local_destroyer (local );
440
+ if (!__rxrpc_use_local (local , rxrpc_local_use_work ))
435
441
break ;
436
- }
437
442
438
443
if (!list_empty (& local -> ack_tx_queue )) {
439
444
rxrpc_transmit_ack_packets (local );
0 commit comments