.. | .. |
---|
38 | 38 | #include "rds.h" |
---|
39 | 39 | #include "loop.h" |
---|
40 | 40 | |
---|
| 41 | +static char * const rds_trans_modules[] = { |
---|
| 42 | + [RDS_TRANS_IB] = "rds_rdma", |
---|
| 43 | + [RDS_TRANS_GAP] = NULL, |
---|
| 44 | + [RDS_TRANS_TCP] = "rds_tcp", |
---|
| 45 | +}; |
---|
| 46 | + |
---|
41 | 47 | static struct rds_transport *transports[RDS_TRANS_COUNT]; |
---|
42 | 48 | static DECLARE_RWSEM(rds_trans_sem); |
---|
43 | 49 | |
---|
.. | .. |
---|
110 | 116 | { |
---|
111 | 117 | struct rds_transport *ret = NULL; |
---|
112 | 118 | struct rds_transport *trans; |
---|
113 | | - unsigned int i; |
---|
114 | 119 | |
---|
115 | 120 | down_read(&rds_trans_sem); |
---|
116 | | - for (i = 0; i < RDS_TRANS_COUNT; i++) { |
---|
117 | | - trans = transports[i]; |
---|
118 | | - |
---|
119 | | - if (trans && trans->t_type == t_type && |
---|
120 | | - (!trans->t_owner || try_module_get(trans->t_owner))) { |
---|
121 | | - ret = trans; |
---|
122 | | - break; |
---|
123 | | - } |
---|
| 121 | + trans = transports[t_type]; |
---|
| 122 | + if (!trans) { |
---|
| 123 | + up_read(&rds_trans_sem); |
---|
| 124 | + if (rds_trans_modules[t_type]) |
---|
| 125 | + request_module(rds_trans_modules[t_type]); |
---|
| 126 | + down_read(&rds_trans_sem); |
---|
| 127 | + trans = transports[t_type]; |
---|
124 | 128 | } |
---|
| 129 | + if (trans && trans->t_type == t_type && |
---|
| 130 | + (!trans->t_owner || try_module_get(trans->t_owner))) |
---|
| 131 | + ret = trans; |
---|
| 132 | + |
---|
125 | 133 | up_read(&rds_trans_sem); |
---|
126 | 134 | |
---|
127 | 135 | return ret; |
---|