hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/net/rds/transport.c
....@@ -38,6 +38,12 @@
3838 #include "rds.h"
3939 #include "loop.h"
4040
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
+
4147 static struct rds_transport *transports[RDS_TRANS_COUNT];
4248 static DECLARE_RWSEM(rds_trans_sem);
4349
....@@ -110,18 +116,20 @@
110116 {
111117 struct rds_transport *ret = NULL;
112118 struct rds_transport *trans;
113
- unsigned int i;
114119
115120 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];
124128 }
129
+ if (trans && trans->t_type == t_type &&
130
+ (!trans->t_owner || try_module_get(trans->t_owner)))
131
+ ret = trans;
132
+
125133 up_read(&rds_trans_sem);
126134
127135 return ret;