]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Revert "RDS: Make message size limit compliant with spec"
authorChuck Anderson <chuck.anderson@oracle.com>
Wed, 4 May 2016 17:18:17 +0000 (10:18 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 4 May 2016 17:18:17 +0000 (10:18 -0700)
This reverts commit ef278157f938011ee08fb683311e5e31ffd29fdf.

Orabug: 23217242

From Avinash Repaka <avinash.repaka@oracle.com>:
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 <avinash.repaka@oracle.com>
Acked-by: Chuck Anderson <chuck.anderson@oracle.com>
net/rds/rdma.c
net/rds/rds.h
net/rds/send.c

index c1de2be806f644b48aae59adaeb8aa361140724c..e49d4b1cc8f4951878ed53709dd298340288f6cd 100644 (file)
@@ -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);
 
index 981775b1a050a11d59d4fbde809e44b89496d0f3..8810398e2472242266809fcf53e0cc61b8ec3240 100644 (file)
@@ -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))
index e033397cac29a26f55e9da2ad422aae82abf5331..5bc6400ae3687ef4d43384320405b95fb5612185 100644 (file)
@@ -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;