mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
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:
parent
6aeaf26222
commit
4c342f778f
@ -64,10 +64,12 @@
|
||||
|
||||
/* supported values for SO_RDS_TRANSPORT */
|
||||
#define RDS_TRANS_IB 0
|
||||
#define RDS_TRANS_IWARP 1
|
||||
#define RDS_TRANS_GAP 1
|
||||
#define RDS_TRANS_TCP 2
|
||||
#define RDS_TRANS_COUNT 3
|
||||
#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 */
|
||||
#define SIOCRDSSETTOS (SIOCPROTOPRIVATE)
|
||||
|
@ -38,6 +38,12 @@
|
||||
#include "rds.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 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 *trans;
|
||||
unsigned int i;
|
||||
|
||||
down_read(&rds_trans_sem);
|
||||
for (i = 0; i < RDS_TRANS_COUNT; i++) {
|
||||
trans = transports[i];
|
||||
|
||||
if (trans && trans->t_type == t_type &&
|
||||
(!trans->t_owner || try_module_get(trans->t_owner))) {
|
||||
ret = trans;
|
||||
break;
|
||||
}
|
||||
trans = transports[t_type];
|
||||
if (!trans) {
|
||||
up_read(&rds_trans_sem);
|
||||
if (rds_trans_modules[t_type])
|
||||
request_module(rds_trans_modules[t_type]);
|
||||
down_read(&rds_trans_sem);
|
||||
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);
|
||||
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user