forked from Minki/linux
RDS: Add GET_MR_FOR_DEST sockopt
RDS currently supports a GET_MR sockopt to establish a memory region (MR) for a chunk of memory. However, the fastreg method ties a MR to a particular destination. The GET_MR_FOR_DEST sockopt allows the remote machine to be specified, and thus support for fastreg (aka FRWRs). Note that this patch does *not* do all of this - it simply implements the new sockopt in terms of the old one, so applications can begin to use the new sockopt in preparation for cutover to FRWRs. Signed-off-by: Andy Grover <andy.grover@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6639104bd8
commit
244546f0d3
@ -56,6 +56,7 @@
|
|||||||
/* deprecated: RDS_BARRIER 4 */
|
/* deprecated: RDS_BARRIER 4 */
|
||||||
#define RDS_RECVERR 5
|
#define RDS_RECVERR 5
|
||||||
#define RDS_CONG_MONITOR 6
|
#define RDS_CONG_MONITOR 6
|
||||||
|
#define RDS_GET_MR_FOR_DEST 7
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Control message types for SOL_RDS.
|
* Control message types for SOL_RDS.
|
||||||
@ -224,6 +225,13 @@ struct rds_get_mr_args {
|
|||||||
uint64_t flags;
|
uint64_t flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct rds_get_mr_for_dest_args {
|
||||||
|
struct sockaddr_storage dest_addr;
|
||||||
|
struct rds_iovec vec;
|
||||||
|
u_int64_t cookie_addr;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
struct rds_free_mr_args {
|
struct rds_free_mr_args {
|
||||||
rds_rdma_cookie_t cookie;
|
rds_rdma_cookie_t cookie;
|
||||||
u_int64_t flags;
|
u_int64_t flags;
|
||||||
|
@ -265,6 +265,9 @@ static int rds_setsockopt(struct socket *sock, int level, int optname,
|
|||||||
case RDS_GET_MR:
|
case RDS_GET_MR:
|
||||||
ret = rds_get_mr(rs, optval, optlen);
|
ret = rds_get_mr(rs, optval, optlen);
|
||||||
break;
|
break;
|
||||||
|
case RDS_GET_MR_FOR_DEST:
|
||||||
|
ret = rds_get_mr_for_dest(rs, optval, optlen);
|
||||||
|
break;
|
||||||
case RDS_FREE_MR:
|
case RDS_FREE_MR:
|
||||||
ret = rds_free_mr(rs, optval, optlen);
|
ret = rds_free_mr(rs, optval, optlen);
|
||||||
break;
|
break;
|
||||||
|
@ -317,6 +317,30 @@ int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen)
|
|||||||
return __rds_rdma_map(rs, &args, NULL, NULL);
|
return __rds_rdma_map(rs, &args, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen)
|
||||||
|
{
|
||||||
|
struct rds_get_mr_for_dest_args args;
|
||||||
|
struct rds_get_mr_args new_args;
|
||||||
|
|
||||||
|
if (optlen != sizeof(struct rds_get_mr_for_dest_args))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (copy_from_user(&args, (struct rds_get_mr_for_dest_args __user *)optval,
|
||||||
|
sizeof(struct rds_get_mr_for_dest_args)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initially, just behave like get_mr().
|
||||||
|
* TODO: Implement get_mr as wrapper around this
|
||||||
|
* and deprecate it.
|
||||||
|
*/
|
||||||
|
new_args.vec = args.vec;
|
||||||
|
new_args.cookie_addr = args.cookie_addr;
|
||||||
|
new_args.flags = args.flags;
|
||||||
|
|
||||||
|
return __rds_rdma_map(rs, &new_args, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the MR indicated by the given R_Key
|
* Free the MR indicated by the given R_Key
|
||||||
*/
|
*/
|
||||||
|
@ -61,6 +61,7 @@ static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen);
|
int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen);
|
||||||
|
int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen);
|
||||||
int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
|
int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
|
||||||
void rds_rdma_drop_keys(struct rds_sock *rs);
|
void rds_rdma_drop_keys(struct rds_sock *rs);
|
||||||
int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
|
int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
|
||||||
|
Loading…
Reference in New Issue
Block a user