list_for_each_entry(tsu, &tsi->tsi_units, tsu_list) {
bulk = srpc_alloc_bulk(lnet_cpt_of_nid(tsu->tsu_dest.nid, NULL),
- off, npg, len, opc == LST_BRW_READ);
+ npg);
if (bulk == NULL) {
brw_client_fini(tsi);
return -ENOMEM;
}
+ srpc_init_bulk(bulk, off, npg, len, opc == LST_BRW_READ);
tsu->tsu_private = bulk;
}
CDEBUG(D_NET, "Transferred %d pages bulk data %s %s\n",
blk->bk_niov, blk->bk_sink ? "from" : "to",
libcfs_id2str(rpc->srpc_peer));
-
- sfw_free_pages(rpc);
}
static int
struct srpc_brw_reply *reply = &replymsg->msg_body.brw_reply;
struct srpc_brw_reqst *reqst = &reqstmsg->msg_body.brw_reqst;
int npg;
- int rc;
LASSERT (sv->sv_id == SRPC_SERVICE_BRW);
return 0;
}
- rc = sfw_alloc_pages(rpc, rpc->srpc_scd->scd_cpt, npg,
- reqst->brw_len,
- reqst->brw_rw == LST_BRW_WRITE);
- if (rc != 0)
- return rc;
+ srpc_init_bulk(rpc->srpc_bulk, 0, npg, reqst->brw_len,
+ reqst->brw_rw == LST_BRW_WRITE);
- if (reqst->brw_rw == LST_BRW_READ)
- brw_fill_bulk(rpc->srpc_bulk, reqst->brw_flags, BRW_MAGIC);
- else
- brw_fill_bulk(rpc->srpc_bulk, reqst->brw_flags, BRW_POISON);
+ if (reqst->brw_rw == LST_BRW_READ)
+ brw_fill_bulk(rpc->srpc_bulk, reqst->brw_flags, BRW_MAGIC);
+ else
+ brw_fill_bulk(rpc->srpc_bulk, reqst->brw_flags, BRW_POISON);
- return 0;
+ return 0;
}
-struct sfw_test_client_ops brw_test_client;
+static int
+brw_srpc_init(struct srpc_server_rpc *rpc, int cpt)
+{
+ /* just alloc a maximal size - actual values will be adjusted later */
+ rpc->srpc_bulk = srpc_alloc_bulk(cpt, LNET_MAX_IOV);
+ if (rpc->srpc_bulk == NULL)
+ return -ENOMEM;
+
+ srpc_init_bulk(rpc->srpc_bulk, 0, LNET_MAX_IOV, 0, 0);
-void brw_init_test_client(void)
+ return 0;
+}
+
+static void
+brw_srpc_fini(struct srpc_server_rpc *rpc)
{
- brw_test_client.tso_init = brw_client_init;
- brw_test_client.tso_fini = brw_client_fini;
- brw_test_client.tso_prep_rpc = brw_client_prep_rpc;
- brw_test_client.tso_done_rpc = brw_client_done_rpc;
+ /* server RPC have just MAX_IOV size */
+ srpc_init_bulk(rpc->srpc_bulk, 0, LNET_MAX_IOV, 0, 0);
+
+ srpc_free_bulk(rpc->srpc_bulk);
+ rpc->srpc_bulk = NULL;
+}
+
+struct sfw_test_client_ops brw_test_client = {
+ .tso_init = brw_client_init,
+ .tso_fini = brw_client_fini,
+ .tso_prep_rpc = brw_client_prep_rpc,
+ .tso_done_rpc = brw_client_done_rpc,
};
-struct srpc_service brw_test_service;
+struct srpc_service brw_test_service = {
+ .sv_id = SRPC_SERVICE_BRW,
+ .sv_name = "brw_test",
+ .sv_handler = brw_server_handle,
+ .sv_bulk_ready = brw_bulk_ready,
+
+ .sv_srpc_init = brw_srpc_init,
+ .sv_srpc_fini = brw_srpc_fini,
+};
void brw_init_test_service(void)
{
- brw_test_service.sv_id = SRPC_SERVICE_BRW;
- brw_test_service.sv_name = "brw_test";
- brw_test_service.sv_handler = brw_server_handle;
- brw_test_service.sv_bulk_ready = brw_bulk_ready;
+ unsigned long cache_size = cfs_totalram_pages() >> 1;
+
+ /* brw prealloc cache should don't eat more than half memory */
+ cache_size /= LNET_MAX_IOV;
+
brw_test_service.sv_wi_total = brw_srv_workitems;
+
+ if (brw_test_service.sv_wi_total > cache_size)
+ brw_test_service.sv_wi_total = cache_size;
}