__u32 ioo_bufcnt; /* number of niobufs for this object */
};
+/* NOTE: IOOBJ_MAX_BRW_BITS defines the _offset_ of the max_brw field in
+ * ioo_max_brw, NOT the maximum number of bits in PTLRPC_BULK_OPS_BITS.
+ * That said, ioo_max_brw is a 32-bit field so the limit is also 16 bits. */
#define IOOBJ_MAX_BRW_BITS 16
-#define IOOBJ_TYPE_MASK ((1U << IOOBJ_MAX_BRW_BITS) - 1)
#define ioobj_max_brw_get(ioo) (((ioo)->ioo_max_brw >> IOOBJ_MAX_BRW_BITS) + 1)
#define ioobj_max_brw_set(ioo, num) \
do { (ioo)->ioo_max_brw = ((num) - 1) << IOOBJ_MAX_BRW_BITS; } while (0)
#define PTLRPC_MD_OPTIONS 0
/**
- * Max # of bulk operations in one request.
+ * log2 max # of bulk operations in one request: 2=4MB/RPC, 5=32MB/RPC, ...
* In order for the client and server to properly negotiate the maximum
* possible transfer size, PTLRPC_BULK_OPS_COUNT must be a power-of-two
* value. The client is free to limit the actual RPC size for any bulk
- * transfer via cl_max_pages_per_rpc to some non-power-of-two value. */
-#define PTLRPC_BULK_OPS_BITS 2
+ * transfer via cl_max_pages_per_rpc to some non-power-of-two value.
+ * NOTE: This is limited to 16 (=64GB RPCs) by IOOBJ_MAX_BRW_BITS. */
+#define PTLRPC_BULK_OPS_BITS 4
+#if PTLRPC_BULK_OPS_BITS > 16
+#error "More than 65536 BRW RPCs not allowed by IOOBJ_MAX_BRW_BITS."
+#endif
#define PTLRPC_BULK_OPS_COUNT (1U << PTLRPC_BULK_OPS_BITS)
/**
* PTLRPC_BULK_OPS_MASK is for the convenience of the client only, and
* encrypt iov, size is either 0 or bd_iov_count.
*/
lnet_kiov_t *bd_enc_vec;
- lnet_kiov_t bd_vec[0];
+ lnet_kiov_t *bd_vec;
} bd_kiov;
struct {
struct kvec *bd_enc_kvec;
- struct kvec bd_kvec[0];
+ struct kvec *bd_kvec;
} bd_kvec;
} bd_u;
(ptlrpc_is_bulk_desc_kvec(type) &&
ops->add_iov_frag != NULL));
+ OBD_ALLOC_PTR(desc);
+ if (desc == NULL)
+ return NULL;
if (type & PTLRPC_BULK_BUF_KIOV) {
- OBD_ALLOC(desc,
- offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kiov.bd_vec[nfrags]));
+ OBD_ALLOC_LARGE(GET_KIOV(desc),
+ nfrags * sizeof(*GET_KIOV(desc)));
+ if (GET_KIOV(desc) == NULL)
+ goto out;
} else {
- OBD_ALLOC(desc,
- offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kvec.bd_kvec[nfrags]));
+ OBD_ALLOC_LARGE(GET_KVEC(desc),
+ nfrags * sizeof(*GET_KVEC(desc)));
+ if (GET_KVEC(desc) == NULL)
+ goto out;
}
- if (!desc)
- return NULL;
-
spin_lock_init(&desc->bd_lock);
init_waitqueue_head(&desc->bd_waitq);
desc->bd_max_iov = nfrags;
LNetInvalidateHandle(&desc->bd_mds[i]);
return desc;
+out:
+ OBD_FREE_PTR(desc);
+ return NULL;
}
/**
desc->bd_frag_ops->release_frags(desc);
if (ptlrpc_is_bulk_desc_kiov(desc->bd_type))
- OBD_FREE(desc, offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kiov.bd_vec[desc->bd_max_iov]));
+ OBD_FREE_LARGE(GET_KIOV(desc),
+ desc->bd_max_iov * sizeof(*GET_KIOV(desc)));
else
- OBD_FREE(desc, offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kvec.bd_kvec[desc->
- bd_max_iov]));
-
+ OBD_FREE_LARGE(GET_KVEC(desc),
+ desc->bd_max_iov * sizeof(*GET_KVEC(desc)));
+ OBD_FREE_PTR(desc);
EXIT;
}
EXPORT_SYMBOL(ptlrpc_free_bulk);
if (GET_ENC_KIOV(desc) != NULL)
return 0;
- OBD_ALLOC(GET_ENC_KIOV(desc),
+ OBD_ALLOC_LARGE(GET_ENC_KIOV(desc),
desc->bd_iov_count * sizeof(*GET_ENC_KIOV(desc)));
if (GET_ENC_KIOV(desc) == NULL)
return -ENOMEM;
* will put request back in queue. */
page_pools.epp_st_outofmem++;
spin_unlock(&page_pools.epp_lock);
- OBD_FREE(GET_ENC_KIOV(desc),
- desc->bd_iov_count *
+ OBD_FREE_LARGE(GET_ENC_KIOV(desc),
+ desc->bd_iov_count *
sizeof(*GET_ENC_KIOV(desc)));
GET_ENC_KIOV(desc) = NULL;
return -ENOMEM;
spin_unlock(&page_pools.epp_lock);
- OBD_FREE(GET_ENC_KIOV(desc),
+ OBD_FREE_LARGE(GET_ENC_KIOV(desc),
desc->bd_iov_count * sizeof(*GET_ENC_KIOV(desc)));
GET_ENC_KIOV(desc) = NULL;
}
(long long)(int)offsetof(struct obd_ioobj, ioo_bufcnt));
LASSERTF((int)sizeof(((struct obd_ioobj *)0)->ioo_bufcnt) == 4, "found %lld\n",
(long long)(int)sizeof(((struct obd_ioobj *)0)->ioo_bufcnt));
+ LASSERTF(IOOBJ_MAX_BRW_BITS == 16, "found %lld\n",
+ (long long)IOOBJ_MAX_BRW_BITS);
/* Checks for union lquota_id */
LASSERTF((int)sizeof(union lquota_id) == 16, "found %lld\n",
CHECK_MEMBER(obd_ioobj, ioo_oid);
CHECK_MEMBER(obd_ioobj, ioo_max_brw);
CHECK_MEMBER(obd_ioobj, ioo_bufcnt);
+ CHECK_VALUE(IOOBJ_MAX_BRW_BITS);
}
static void
(long long)(int)offsetof(struct obd_ioobj, ioo_bufcnt));
LASSERTF((int)sizeof(((struct obd_ioobj *)0)->ioo_bufcnt) == 4, "found %lld\n",
(long long)(int)sizeof(((struct obd_ioobj *)0)->ioo_bufcnt));
+ LASSERTF(IOOBJ_MAX_BRW_BITS == 16, "found %lld\n",
+ (long long)IOOBJ_MAX_BRW_BITS);
/* Checks for union lquota_id */
LASSERTF((int)sizeof(union lquota_id) == 16, "found %lld\n",