rds: transport module should be auto loaded when transport is set

This enhancement auto loads transport module when the transport
is set via SO_RDS_TRANSPORT socket option.

Reviewed-by: Ka-Cheong Poon <ka-cheong.poon@oracle.com>
Reviewed-by: Håkon Bugge <haakon.bugge@oracle.com>
Signed-off-by: Rao Shoaib <rao.shoaib@oracle.com>
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Rao Shoaib
2020-06-25 13:46:00 -07:00
committed by David S. Miller
parent 6aeaf26222
commit 4c342f778f
2 changed files with 20 additions and 10 deletions

View File

@@ -64,10 +64,12 @@
/* supported values for SO_RDS_TRANSPORT */ /* supported values for SO_RDS_TRANSPORT */
#define RDS_TRANS_IB 0 #define RDS_TRANS_IB 0
#define RDS_TRANS_IWARP 1 #define RDS_TRANS_GAP 1
#define RDS_TRANS_TCP 2 #define RDS_TRANS_TCP 2
#define RDS_TRANS_COUNT 3 #define RDS_TRANS_COUNT 3
#define RDS_TRANS_NONE (~0) #define RDS_TRANS_NONE (~0)
/* don't use RDS_TRANS_IWARP - it is deprecated */
#define RDS_TRANS_IWARP RDS_TRANS_GAP
/* IOCTLS commands for SOL_RDS */ /* IOCTLS commands for SOL_RDS */
#define SIOCRDSSETTOS (SIOCPROTOPRIVATE) #define SIOCRDSSETTOS (SIOCPROTOPRIVATE)

View File

@@ -38,6 +38,12 @@
#include "rds.h" #include "rds.h"
#include "loop.h" #include "loop.h"
static char * const rds_trans_modules[] = {
[RDS_TRANS_IB] = "rds_rdma",
[RDS_TRANS_GAP] = NULL,
[RDS_TRANS_TCP] = "rds_tcp",
};
static struct rds_transport *transports[RDS_TRANS_COUNT]; static struct rds_transport *transports[RDS_TRANS_COUNT];
static DECLARE_RWSEM(rds_trans_sem); static DECLARE_RWSEM(rds_trans_sem);
@@ -110,18 +116,20 @@ struct rds_transport *rds_trans_get(int t_type)
{ {
struct rds_transport *ret = NULL; struct rds_transport *ret = NULL;
struct rds_transport *trans; struct rds_transport *trans;
unsigned int i;
down_read(&rds_trans_sem); down_read(&rds_trans_sem);
for (i = 0; i < RDS_TRANS_COUNT; i++) { trans = transports[t_type];
trans = transports[i]; if (!trans) {
up_read(&rds_trans_sem);
if (trans && trans->t_type == t_type && if (rds_trans_modules[t_type])
(!trans->t_owner || try_module_get(trans->t_owner))) { request_module(rds_trans_modules[t_type]);
ret = trans; down_read(&rds_trans_sem);
break; trans = transports[t_type];
}
} }
if (trans && trans->t_type == t_type &&
(!trans->t_owner || try_module_get(trans->t_owner)))
ret = trans;
up_read(&rds_trans_sem); up_read(&rds_trans_sem);
return ret; return ret;