Whamcloud - gitweb
LU-16011 lnet: use preallocate bulk for server
[fs/lustre-release.git] / lnet / selftest / brw_test.c
index 2e77d8f..83e0548 100644 (file)
@@ -120,11 +120,12 @@ brw_client_init(struct sfw_test_instance *tsi)
 
        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;
        }
@@ -388,8 +389,6 @@ brw_server_rpc_done(struct srpc_server_rpc *rpc)
                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
@@ -437,7 +436,6 @@ brw_server_handle(struct srpc_server_rpc *rpc)
        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);
 
@@ -488,37 +486,66 @@ brw_server_handle(struct srpc_server_rpc *rpc)
                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;
 }