~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/rds/loop.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /net/rds/loop.c (Version linux-6.12-rc7) and /net/rds/loop.c (Version unix-v6-master)


  1 /*                                                  1 
  2  * Copyright (c) 2006, 2017 Oracle and/or its     
  3  *                                                
  4  * This software is available to you under a c    
  5  * licenses.  You may choose to be licensed un    
  6  * General Public License (GPL) Version 2, ava    
  7  * COPYING in the main directory of this sourc    
  8  * OpenIB.org BSD license below:                  
  9  *                                                
 10  *     Redistribution and use in source and bi    
 11  *     without modification, are permitted pro    
 12  *     conditions are met:                        
 13  *                                                
 14  *      - Redistributions of source code must     
 15  *        copyright notice, this list of condi    
 16  *        disclaimer.                             
 17  *                                                
 18  *      - Redistributions in binary form must     
 19  *        copyright notice, this list of condi    
 20  *        disclaimer in the documentation and/    
 21  *        provided with the distribution.         
 22  *                                                
 23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT W    
 24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMIT    
 25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR P    
 26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTH    
 27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER L    
 28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS    
 29  * CONNECTION WITH THE SOFTWARE OR THE USE OR     
 30  * SOFTWARE.                                      
 31  *                                                
 32  */                                               
 33 #include <linux/kernel.h>                         
 34 #include <linux/slab.h>                           
 35 #include <linux/in.h>                             
 36 #include <net/net_namespace.h>                    
 37 #include <net/netns/generic.h>                    
 38 #include <linux/ipv6.h>                           
 39                                                   
 40 #include "rds_single_path.h"                      
 41 #include "rds.h"                                  
 42 #include "loop.h"                                 
 43                                                   
 44 static DEFINE_SPINLOCK(loop_conns_lock);          
 45 static LIST_HEAD(loop_conns);                     
 46 static atomic_t rds_loop_unloading = ATOMIC_IN    
 47                                                   
 48 static void rds_loop_set_unloading(void)          
 49 {                                                 
 50         atomic_set(&rds_loop_unloading, 1);       
 51 }                                                 
 52                                                   
 53 static bool rds_loop_is_unloading(struct rds_c    
 54 {                                                 
 55         return atomic_read(&rds_loop_unloading    
 56 }                                                 
 57                                                   
 58 /*                                                
 59  * This 'loopback' transport is a special case    
 60  * and terminate on the same machine.             
 61  *                                                
 62  * Connection build-up notices if the destinat    
 63  * as a local address by a transport.  At that    
 64  * loopback transport instead of the bound tra    
 65  *                                                
 66  * The loopback transport's sending path just     
 67  * straight to the receiving path via an embed    
 68  */                                               
 69                                                   
 70 /*                                                
 71  * Usually a message transits both the sender     
 72  * flows to the receiver.  In the loopback cas    
 73  * is handed the sending conn so the sense of     
 74  */                                               
 75 static int rds_loop_xmit(struct rds_connection    
 76                          unsigned int hdr_off,    
 77                          unsigned int off)        
 78 {                                                 
 79         struct scatterlist *sgp = &rm->data.op    
 80         int ret = sizeof(struct rds_header) +     
 81                         be32_to_cpu(rm->m_inc.    
 82                                                   
 83         /* Do not send cong updates to loopbac    
 84         if (rm->m_inc.i_hdr.h_flags & RDS_FLAG    
 85                 rds_cong_map_updated(conn->c_f    
 86                 ret = min_t(int, ret, sgp->len    
 87                 goto out;                         
 88         }                                         
 89                                                   
 90         BUG_ON(hdr_off || sg || off);             
 91                                                   
 92         rds_inc_init(&rm->m_inc, conn, &conn->    
 93         /* For the embedded inc. Matching put     
 94         rds_message_addref(rm);                   
 95                                                   
 96         rds_recv_incoming(conn, &conn->c_laddr    
 97                           GFP_KERNEL);            
 98                                                   
 99         rds_send_drop_acked(conn, be64_to_cpu(    
100                             NULL);                
101                                                   
102         rds_inc_put(&rm->m_inc);                  
103 out:                                              
104         return ret;                               
105 }                                                 
106                                                   
107 /*                                                
108  * See rds_loop_xmit(). Since our inc is embed    
109  * make sure the rm lives at least until the i    
110  */                                               
111 static void rds_loop_inc_free(struct rds_incom    
112 {                                                 
113         struct rds_message *rm = container_of(    
114                                                   
115         rds_message_put(rm);                      
116 }                                                 
117                                                   
118 /* we need to at least give the thread somethi    
119 static int rds_loop_recv_path(struct rds_conn_    
120 {                                                 
121         return 0;                                 
122 }                                                 
123                                                   
124 struct rds_loop_connection {                      
125         struct list_head loop_node;               
126         struct rds_connection *conn;              
127 };                                                
128                                                   
129 /*                                                
130  * Even the loopback transport needs to keep t    
131  * so it can call rds_conn_destroy() on them o    
132  * 1+ loopback addresses (127.*.*.*) so it's n    
133  * multiple loopback conns allocated, although    
134  */                                               
135 static int rds_loop_conn_alloc(struct rds_conn    
136 {                                                 
137         struct rds_loop_connection *lc;           
138         unsigned long flags;                      
139                                                   
140         lc = kzalloc(sizeof(struct rds_loop_co    
141         if (!lc)                                  
142                 return -ENOMEM;                   
143                                                   
144         INIT_LIST_HEAD(&lc->loop_node);           
145         lc->conn = conn;                          
146         conn->c_transport_data = lc;              
147                                                   
148         spin_lock_irqsave(&loop_conns_lock, fl    
149         list_add_tail(&lc->loop_node, &loop_co    
150         spin_unlock_irqrestore(&loop_conns_loc    
151                                                   
152         return 0;                                 
153 }                                                 
154                                                   
155 static void rds_loop_conn_free(void *arg)         
156 {                                                 
157         struct rds_loop_connection *lc = arg;     
158         unsigned long flags;                      
159                                                   
160         rdsdebug("lc %p\n", lc);                  
161         spin_lock_irqsave(&loop_conns_lock, fl    
162         list_del(&lc->loop_node);                 
163         spin_unlock_irqrestore(&loop_conns_loc    
164         kfree(lc);                                
165 }                                                 
166                                                   
167 static int rds_loop_conn_path_connect(struct r    
168 {                                                 
169         rds_connect_complete(cp->cp_conn);        
170         return 0;                                 
171 }                                                 
172                                                   
173 static void rds_loop_conn_path_shutdown(struct    
174 {                                                 
175 }                                                 
176                                                   
177 void rds_loop_exit(void)                          
178 {                                                 
179         struct rds_loop_connection *lc, *_lc;     
180         LIST_HEAD(tmp_list);                      
181                                                   
182         rds_loop_set_unloading();                 
183         synchronize_rcu();                        
184         /* avoid calling conn_destroy with irq    
185         spin_lock_irq(&loop_conns_lock);          
186         list_splice(&loop_conns, &tmp_list);      
187         INIT_LIST_HEAD(&loop_conns);              
188         spin_unlock_irq(&loop_conns_lock);        
189                                                   
190         list_for_each_entry_safe(lc, _lc, &tmp    
191                 WARN_ON(lc->conn->c_passive);     
192                 rds_conn_destroy(lc->conn);       
193         }                                         
194 }                                                 
195                                                   
196 static void rds_loop_kill_conns(struct net *ne    
197 {                                                 
198         struct rds_loop_connection *lc, *_lc;     
199         LIST_HEAD(tmp_list);                      
200                                                   
201         spin_lock_irq(&loop_conns_lock);          
202         list_for_each_entry_safe(lc, _lc, &loo    
203                 struct net *c_net = read_pnet(    
204                                                   
205                 if (net != c_net)                 
206                         continue;                 
207                 list_move_tail(&lc->loop_node,    
208         }                                         
209         spin_unlock_irq(&loop_conns_lock);        
210                                                   
211         list_for_each_entry_safe(lc, _lc, &tmp    
212                 WARN_ON(lc->conn->c_passive);     
213                 rds_conn_destroy(lc->conn);       
214         }                                         
215 }                                                 
216                                                   
217 static void __net_exit rds_loop_exit_net(struc    
218 {                                                 
219         rds_loop_kill_conns(net);                 
220 }                                                 
221                                                   
222 static struct pernet_operations rds_loop_net_o    
223         .exit = rds_loop_exit_net,                
224 };                                                
225                                                   
226 int rds_loop_net_init(void)                       
227 {                                                 
228         return register_pernet_device(&rds_loo    
229 }                                                 
230                                                   
231 void rds_loop_net_exit(void)                      
232 {                                                 
233         unregister_pernet_device(&rds_loop_net    
234 }                                                 
235                                                   
236 /*                                                
237  * This is missing .xmit_* because loop doesn'    
238  * rds_send_xmit() and doesn't call rds_recv_i    
239  * .laddr_check are missing because transport.    
240  * rds_loop_transport.                            
241  */                                               
242 struct rds_transport rds_loop_transport = {       
243         .xmit                   = rds_loop_xmi    
244         .recv_path              = rds_loop_rec    
245         .conn_alloc             = rds_loop_con    
246         .conn_free              = rds_loop_con    
247         .conn_path_connect      = rds_loop_con    
248         .conn_path_shutdown     = rds_loop_con    
249         .inc_copy_to_user       = rds_message_    
250         .inc_free               = rds_loop_inc    
251         .t_name                 = "loopback",     
252         .t_type                 = RDS_TRANS_LO    
253         .t_unloading            = rds_loop_is_    
254 };                                                
255                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php