@@ -103,6 +103,7 @@ static struct rxrpc_local *rxrpc_alloc_local(struct rxrpc_net *rxnet,
103103 init_rwsem (& local -> defrag_sem );
104104 skb_queue_head_init (& local -> reject_queue );
105105 skb_queue_head_init (& local -> event_queue );
106+ skb_queue_head_init (& local -> rx_queue );
106107 local -> client_bundles = RB_ROOT ;
107108 spin_lock_init (& local -> client_bundles_lock );
108109 spin_lock_init (& local -> lock );
@@ -126,6 +127,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
126127 struct udp_tunnel_sock_cfg tuncfg = {NULL };
127128 struct sockaddr_rxrpc * srx = & local -> srx ;
128129 struct udp_port_cfg udp_conf = {0 };
130+ struct task_struct * io_thread ;
129131 struct sock * usk ;
130132 int ret ;
131133
@@ -185,8 +187,23 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
185187 BUG ();
186188 }
187189
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 ;
188198 _leave (" = 0" );
189199 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 ;
190207}
191208
192209/*
@@ -360,19 +377,8 @@ struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local,
360377 */
361378void rxrpc_unuse_local (struct rxrpc_local * local , enum rxrpc_local_trace why )
362379{
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 );
376382}
377383
378384/*
@@ -382,7 +388,7 @@ void rxrpc_unuse_local(struct rxrpc_local *local, enum rxrpc_local_trace why)
382388 * Closing the socket cannot be done from bottom half context or RCU callback
383389 * context because it might sleep.
384390 */
385- static void rxrpc_local_destroyer (struct rxrpc_local * local )
391+ void rxrpc_destroy_local (struct rxrpc_local * local )
386392{
387393 struct socket * socket = local -> socket ;
388394 struct rxrpc_net * rxnet = local -> rxnet ;
@@ -411,6 +417,7 @@ static void rxrpc_local_destroyer(struct rxrpc_local *local)
411417 */
412418 rxrpc_purge_queue (& local -> reject_queue );
413419 rxrpc_purge_queue (& local -> event_queue );
420+ rxrpc_purge_queue (& local -> rx_queue );
414421}
415422
416423/*
@@ -430,10 +437,8 @@ static void rxrpc_local_processor(struct work_struct *work)
430437
431438 do {
432439 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 ))
435441 break ;
436- }
437442
438443 if (!list_empty (& local -> ack_tx_queue )) {
439444 rxrpc_transmit_ack_packets (local );
0 commit comments