#define RDS_FRAG_SIZE ((unsigned int)(1 << RDS_FRAG_SHIFT))
#define RDS_MAX_FRAG_SIZE SZ_16K
-/* Used to limit both RDMA and non-RDMA RDS message to 1MB */
-#define RDS_MAX_MSG_SIZE ((unsigned int)(1 << 20))
-
#define RDS_CONG_MAP_BYTES (65536 / 8)
#define RDS_CONG_PAGE_SIZE (1UL << 12)
#define RDS_CONG_MAP_LONGS (RDS_CONG_MAP_BYTES / sizeof(unsigned long))
return ret;
}
-static inline int rds_rdma_bytes(struct msghdr *msg, size_t *rdma_bytes)
+static inline unsigned int rds_rdma_bytes(struct msghdr *msg)
{
struct rds_rdma_args *args;
struct cmsghdr *cmsg;
+ unsigned int rdma_bytes = 0;
for_each_cmsghdr(cmsg, msg) {
- if (!CMSG_OK(msg, cmsg))
- return -EINVAL;
-
- if (cmsg->cmsg_level != SOL_RDS)
- continue;
-
if (cmsg->cmsg_type == RDS_CMSG_RDMA_ARGS) {
args = CMSG_DATA(cmsg);
- *rdma_bytes += args->remote_vec.bytes;
+ rdma_bytes += args->remote_vec.bytes;
}
}
- return 0;
+ return rdma_bytes;
}
int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
int queued = 0, allocated_mr = 0;
int nonblock = msg->msg_flags & MSG_DONTWAIT;
long timeo = sock_sndtimeo(sk, nonblock);
- size_t total_payload_len = payload_len, rdma_payload_len = 0;
+ size_t total_payload_len = payload_len;
/* Mirror Linux UDP mirror of BSD error message compatibility */
/* XXX: Perhaps MSG_MORE someday */
}
release_sock(sk);
- ret = rds_rdma_bytes(msg, &rdma_payload_len);
- if (ret)
- goto out;
-
- if (max_t(size_t, payload_len, rdma_payload_len) > RDS_MAX_MSG_SIZE) {
- ret = -EMSGSIZE;
- goto out;
- }
-
if (payload_len > rds_sk_sndbuf(rs)) {
ret = -EMSGSIZE;
goto out;
/* For RDMA operation(s), add up rmda bytes to payload to make
* sure its within system QoS threshold limits.
*/
- total_payload_len += rdma_payload_len;
+ if (rm->rdma.op_active)
+ total_payload_len += rds_rdma_bytes(msg);
if (rds_check_qos_threshold(rs->rs_tos, total_payload_len)) {
ret = -EINVAL;