#define QPE_NUM_PAGES(_QPE) ((u32) \
                             (DIV_ROUND_UP(_QPE.produce_size, PAGE_SIZE) + \
                              DIV_ROUND_UP(_QPE.consume_size, PAGE_SIZE) + 2))
-
+#define QP_SIZES_ARE_VALID(_prod_qsize, _cons_qsize) \
+       ((_prod_qsize) + (_cons_qsize) >= max(_prod_qsize, _cons_qsize) && \
+        (_prod_qsize) + (_cons_qsize) <= VMCI_MAX_GUEST_QP_MEMORY)
 
 /*
  * Frees kernel VA space for a given queue and its queue header, and
        u64 num_pages;
        const size_t queue_size = sizeof(*queue) + sizeof(*(queue->kernel_if));
 
-       if (size > SIZE_MAX - PAGE_SIZE)
+       if (size > min_t(size_t, VMCI_MAX_GUEST_QP_MEMORY, SIZE_MAX - PAGE_SIZE))
                return NULL;
        num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
        if (num_pages > (SIZE_MAX - queue_size) /
                         struct vmci_qp_page_store *page_store,
                         struct vmci_ctx *context)
 {
+       if (!QP_SIZES_ARE_VALID(produce_size, consume_size))
+               return VMCI_ERROR_NO_RESOURCES;
+
        return qp_broker_alloc(handle, peer, flags, priv_flags,
                               produce_size, consume_size,
                               page_store, context, NULL, NULL, NULL, NULL);
         * used by the device is NO_RESOURCES, so use that here too.
         */
 
-       if (produce_qsize + consume_qsize < max(produce_qsize, consume_qsize) ||
-           produce_qsize + consume_qsize > VMCI_MAX_GUEST_QP_MEMORY)
+       if (!QP_SIZES_ARE_VALID(produce_qsize, consume_qsize))
                return VMCI_ERROR_NO_RESOURCES;
 
        retval = vmci_route(&src, &dst, false, &route);
 
  * consists of at least two pages, the memory limit also dictates the
  * number of queue pairs a guest can create.
  */
-#define VMCI_MAX_GUEST_QP_MEMORY (128 * 1024 * 1024)
+#define VMCI_MAX_GUEST_QP_MEMORY ((size_t)(128 * 1024 * 1024))
 #define VMCI_MAX_GUEST_QP_COUNT  (VMCI_MAX_GUEST_QP_MEMORY / PAGE_SIZE / 2)
 
 /*
  * too much kernel memory (especially on vmkernel).  We limit a queuepair to
  * 32 KB, or 16 KB per queue for symmetrical pairs.
  */
-#define VMCI_MAX_PINNED_QP_MEMORY (32 * 1024)
+#define VMCI_MAX_PINNED_QP_MEMORY ((size_t)(32 * 1024))
 
 /*
  * We have a fixed set of resource IDs available in the VMX.