From: Chuck Anderson Date: Wed, 4 May 2016 17:18:17 +0000 (-0700) Subject: Revert "RDS: Make message size limit compliant with spec" X-Git-Tag: v4.1.12-92~169^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=a4f65b7ef734aa6b6c9f06d2830a72a243adbf50;p=users%2Fjedix%2Flinux-maple.git Revert "RDS: Make message size limit compliant with spec" This reverts commit ef278157f938011ee08fb683311e5e31ffd29fdf. Orabug: 23217242 From Avinash Repaka : This patch reverts the fix for Orabug: 22661521, since the fix assumes that the memory region is always aligned on a page boundary, causing an EMSGSIZE error when trying to register 1MB region that isn't 4KB aligned. These issues were observed on kernel 4.1.12-39.el6uek tag. Signed-off-by: Avinash Repaka Acked-by: Chuck Anderson --- diff --git a/net/rds/rdma.c b/net/rds/rdma.c index c1de2be806f6..e49d4b1cc8f4 100644 --- a/net/rds/rdma.c +++ b/net/rds/rdma.c @@ -200,11 +200,6 @@ static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args, goto out; } - if ((nr_pages << PAGE_SHIFT) > RDS_MAX_MSG_SIZE) { - ret = -EMSGSIZE; - goto out; - } - rdsdebug("RDS: get_mr addr %llx len %llu nr_pages %u\n", args->vec.addr, args->vec.bytes, nr_pages); diff --git a/net/rds/rds.h b/net/rds/rds.h index 981775b1a050..8810398e2472 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -59,9 +59,6 @@ rdsdebug(char *fmt, ...) #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)) diff --git a/net/rds/send.c b/net/rds/send.c index e033397cac29..5bc6400ae368 100644 --- a/net/rds/send.c +++ b/net/rds/send.c @@ -1159,25 +1159,20 @@ static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm, 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) @@ -1193,7 +1188,7 @@ 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 */ @@ -1227,15 +1222,6 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len) } 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; @@ -1266,7 +1252,8 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len) /* 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;