| .. | .. |
|---|
| 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; |
|---|