X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fselftest%2Fbrw_test.c;h=657720005d7602a4df54f5d86796bdfa2771e242;hb=d74d86840056e83cd0138a261ab7b6040a43bfb4;hp=f905c0cd26936522d2e2948a02437848903b0f5f;hpb=1b2547843817b4b7adbeb87ea9b070d9cac35c90;p=fs%2Flustre-release.git diff --git a/lnet/selftest/brw_test.c b/lnet/selftest/brw_test.c index f905c0c..6577200 100644 --- a/lnet/selftest/brw_test.c +++ b/lnet/selftest/brw_test.c @@ -1,39 +1,14 @@ -/* - * GPL HEADER START - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 only, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License version 2 for more details (a copy is included - * in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - * GPL HEADER END - */ +// SPDX-License-Identifier: GPL-2.0 + /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2013, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. */ + /* * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. - * - * lnet/selftest/brw_test.c * * Author: Isaac Huang */ @@ -41,56 +16,61 @@ #include "selftest.h" static int brw_srv_workitems = SFW_TEST_WI_MAX; -CFS_MODULE_PARM(brw_srv_workitems, "i", int, 0644, "# BRW server workitems"); +module_param(brw_srv_workitems, int, 0644); +MODULE_PARM_DESC(brw_srv_workitems, "# BRW server workitems"); static int brw_inject_errors; -CFS_MODULE_PARM(brw_inject_errors, "i", int, 0644, - "# data errors to inject randomly, zero by default"); +module_param(brw_inject_errors, int, 0644); +MODULE_PARM_DESC(brw_inject_errors, "# data errors to inject randomly, zero by default"); + +#define BRW_POISON 0xbeefbeefbeefbeefULL +#define BRW_MAGIC 0xeeb0eeb1eeb2eeb3ULL +#define BRW_MSIZE sizeof(__u64) static void -brw_client_fini (sfw_test_instance_t *tsi) +brw_client_fini(struct sfw_test_instance *tsi) { - srpc_bulk_t *bulk; - sfw_test_unit_t *tsu; + struct srpc_bulk *bulk; + struct sfw_test_unit *tsu; - LASSERT (tsi->tsi_is_client); + LASSERT(tsi->tsi_is_client); - cfs_list_for_each_entry_typed (tsu, &tsi->tsi_units, - sfw_test_unit_t, tsu_list) { - bulk = tsu->tsu_private; - if (bulk == NULL) continue; + list_for_each_entry(tsu, &tsi->tsi_units, tsu_list) { + bulk = tsu->tsu_private; + if (bulk == NULL) + continue; - srpc_free_bulk(bulk); - tsu->tsu_private = NULL; - } + srpc_free_bulk(bulk); + tsu->tsu_private = NULL; + } } -int -brw_client_init (sfw_test_instance_t *tsi) +static int +brw_client_init(struct sfw_test_instance *tsi) { - sfw_session_t *sn = tsi->tsi_batch->bat_session; + struct sfw_session *sn = tsi->tsi_batch->bat_session; int flags; - int npg; - int len; + int off; + unsigned int len; int opc; - srpc_bulk_t *bulk; - sfw_test_unit_t *tsu; + struct srpc_bulk *bulk; + struct sfw_test_unit *tsu; LASSERT(sn != NULL); LASSERT(tsi->tsi_is_client); if ((sn->sn_features & LST_FEAT_BULK_LEN) == 0) { - test_bulk_req_t *breq = &tsi->tsi_u.bulk_v0; + struct test_bulk_req *breq = &tsi->tsi_u.bulk_v0; opc = breq->blk_opc; flags = breq->blk_flags; - npg = breq->blk_npg; /* NB: this is not going to work for variable page size, * but we have to keep it for compatibility */ - len = npg * PAGE_CACHE_SIZE; + len = breq->blk_npg * PAGE_SIZE; + off = 0; } else { - test_bulk_req_v1_t *breq = &tsi->tsi_u.bulk_v1; + struct test_bulk_req_v1 *breq = &tsi->tsi_u.bulk_v1; /* I should never get this step if it's unknown feature * because make_session will reject unknown feature */ @@ -99,10 +79,13 @@ brw_client_init (sfw_test_instance_t *tsi) opc = breq->blk_opc; flags = breq->blk_flags; len = breq->blk_len; - npg = (len + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; + off = breq->blk_offset & ~PAGE_MASK; } - if (npg > LNET_MAX_IOV || npg <= 0) + if (off % BRW_MSIZE != 0) + return -EINVAL; + + if (len > LNET_MTU) return -EINVAL; if (opc != LST_BRW_READ && opc != LST_BRW_WRITE) @@ -112,17 +95,17 @@ brw_client_init (sfw_test_instance_t *tsi) flags != LST_BRW_CHECK_FULL && flags != LST_BRW_CHECK_SIMPLE) return -EINVAL; - cfs_list_for_each_entry_typed(tsu, &tsi->tsi_units, - sfw_test_unit_t, tsu_list) { - bulk = srpc_alloc_bulk(lnet_cpt_of_nid(tsu->tsu_dest.nid), - npg, len, opc == LST_BRW_READ); - if (bulk == NULL) { - brw_client_fini(tsi); - return -ENOMEM; - } + list_for_each_entry(tsu, &tsi->tsi_units, tsu_list) { + bulk = srpc_alloc_bulk(lnet_cpt_of_nid(tsu->tsu_dest.nid, NULL), + len); + if (bulk == NULL) { + brw_client_fini(tsi); + return -ENOMEM; + } + srpc_init_bulk(bulk, off, len, opc == LST_BRW_READ); - tsu->tsu_private = bulk; - } + tsu->tsu_private = bulk; + } return 0; } @@ -131,162 +114,166 @@ brw_client_init (sfw_test_instance_t *tsi) #define BRW_MAGIC 0xeeb0eeb1eeb2eeb3ULL #define BRW_MSIZE sizeof(__u64) -int -brw_inject_one_error (void) +static int brw_inject_one_error(void) { - struct timeval tv; + struct timespec64 ts; - if (brw_inject_errors <= 0) return 0; + if (brw_inject_errors <= 0) return 0; -#ifndef __KERNEL__ - gettimeofday(&tv, NULL); -#else - cfs_gettimeofday(&tv); -#endif + ktime_get_ts64(&ts); - if ((tv.tv_usec & 1) == 0) return 0; + if (((ts.tv_nsec / NSEC_PER_USEC) & 1) == 0) + return 0; - return brw_inject_errors--; + return brw_inject_errors--; } -void -brw_fill_page (struct page *pg, int pattern, __u64 magic) +static void +brw_fill_page(struct page *pg, int off, int len, int pattern, __u64 magic) { - char *addr = page_address(pg); - int i; + char *addr = page_address(pg) + off; + int i; - LASSERT (addr != NULL); + LASSERT(addr != NULL); + LASSERT(off % BRW_MSIZE == 0 && len % BRW_MSIZE == 0); - if (pattern == LST_BRW_CHECK_NONE) return; + if (pattern == LST_BRW_CHECK_NONE) + return; - if (magic == BRW_MAGIC) - magic += brw_inject_one_error(); + if (magic == BRW_MAGIC) + magic += brw_inject_one_error(); - if (pattern == LST_BRW_CHECK_SIMPLE) { - memcpy(addr, &magic, BRW_MSIZE); - addr += PAGE_CACHE_SIZE - BRW_MSIZE; - memcpy(addr, &magic, BRW_MSIZE); - return; - } - - if (pattern == LST_BRW_CHECK_FULL) { - for (i = 0; i < PAGE_CACHE_SIZE / BRW_MSIZE; i++) - memcpy(addr + i * BRW_MSIZE, &magic, BRW_MSIZE); - return; - } + if (pattern == LST_BRW_CHECK_SIMPLE) { + memcpy(addr, &magic, BRW_MSIZE); + if (len > BRW_MSIZE) { + addr += len - BRW_MSIZE; + memcpy(addr, &magic, BRW_MSIZE); + } + return; + } - LBUG (); - return; + if (pattern == LST_BRW_CHECK_FULL) { + for (i = 0; i < len; i += BRW_MSIZE) + memcpy(addr + i, &magic, BRW_MSIZE); + return; + } + LBUG(); } -int -brw_check_page (struct page *pg, int pattern, __u64 magic) +static int +brw_check_page(struct page *pg, int off, int len, int pattern, __u64 magic) { - char *addr = page_address(pg); - __u64 data = 0; /* make compiler happy */ - int i; + char *addr = page_address(pg) + off; + __u64 data = 0; /* make compiler happy */ + int i; - LASSERT (addr != NULL); + LASSERT(addr != NULL); + LASSERT(off % BRW_MSIZE == 0 && len % BRW_MSIZE == 0); - if (pattern == LST_BRW_CHECK_NONE) - return 0; - - if (pattern == LST_BRW_CHECK_SIMPLE) { - data = *((__u64 *) addr); - if (data != magic) goto bad_data; - - addr += PAGE_CACHE_SIZE - BRW_MSIZE; - data = *((__u64 *) addr); - if (data != magic) goto bad_data; + if (pattern == LST_BRW_CHECK_NONE) + return 0; - return 0; - } + if (pattern == LST_BRW_CHECK_SIMPLE) { + data = *((__u64 *) addr); + if (data != magic) + goto bad_data; - if (pattern == LST_BRW_CHECK_FULL) { - for (i = 0; i < PAGE_CACHE_SIZE / BRW_MSIZE; i++) { - data = *(((__u64 *) addr) + i); - if (data != magic) goto bad_data; - } + if (len > BRW_MSIZE) { + addr += len - BRW_MSIZE; + data = *((__u64 *) addr); + if (data != magic) + goto bad_data; + } + return 0; + } - return 0; - } + if (pattern == LST_BRW_CHECK_FULL) { + for (i = 0; i < len; i += BRW_MSIZE) { + data = *(__u64 *)(addr + i); + if (data != magic) + goto bad_data; + } + return 0; + } - LBUG (); + LBUG(); bad_data: - CERROR ("Bad data in page %p: "LPX64", "LPX64" expected\n", - pg, data, magic); - return 1; + CERROR ("Bad data in page %p: %#llx, %#llx expected\n", + pg, data, magic); + return 1; } -void -brw_fill_bulk (srpc_bulk_t *bk, int pattern, __u64 magic) +static void +brw_fill_bulk(struct srpc_bulk *bk, int pattern, __u64 magic) { - int i; + int i; struct page *pg; - for (i = 0; i < bk->bk_niov; i++) { -#ifdef __KERNEL__ - pg = bk->bk_iovs[i].kiov_page; -#else - LASSERT (bk->bk_pages != NULL); - pg = bk->bk_pages[i]; -#endif - brw_fill_page(pg, pattern, magic); - } + for (i = 0; i < bk->bk_niov; i++) { + int off; + int len; + + pg = bk->bk_iovs[i].bv_page; + off = bk->bk_iovs[i].bv_offset; + len = bk->bk_iovs[i].bv_len; + brw_fill_page(pg, off, len, pattern, magic); + } } -int -brw_check_bulk (srpc_bulk_t *bk, int pattern, __u64 magic) +static int +brw_check_bulk(struct srpc_bulk *bk, int pattern, __u64 magic) { - int i; + int i; struct page *pg; - for (i = 0; i < bk->bk_niov; i++) { -#ifdef __KERNEL__ - pg = bk->bk_iovs[i].kiov_page; -#else - LASSERT (bk->bk_pages != NULL); - pg = bk->bk_pages[i]; -#endif - if (brw_check_page(pg, pattern, magic) != 0) { - CERROR ("Bulk page %p (%d/%d) is corrupted!\n", - pg, i, bk->bk_niov); - return 1; - } - } + for (i = 0; i < bk->bk_niov; i++) { + int off; + int len; + + pg = bk->bk_iovs[i].bv_page; + off = bk->bk_iovs[i].bv_offset; + len = bk->bk_iovs[i].bv_len; + if (brw_check_page(pg, off, len, pattern, magic) != 0) { + CERROR("Bulk page %p (%d/%d) is corrupted!\n", + pg, i, bk->bk_niov); + return 1; + } + } - return 0; + return 0; } static int -brw_client_prep_rpc (sfw_test_unit_t *tsu, - lnet_process_id_t dest, srpc_client_rpc_t **rpcpp) +brw_client_prep_rpc(struct sfw_test_unit *tsu, struct lnet_process_id dest, + struct srpc_client_rpc **rpcpp) { - srpc_bulk_t *bulk = tsu->tsu_private; - sfw_test_instance_t *tsi = tsu->tsu_instance; - sfw_session_t *sn = tsi->tsi_batch->bat_session; - srpc_client_rpc_t *rpc; - srpc_brw_reqst_t *req; - int flags; - int npg; - int len; - int opc; - int rc; + struct srpc_bulk *bulk = tsu->tsu_private; + struct sfw_test_instance *tsi = tsu->tsu_instance; + struct sfw_session *sn = tsi->tsi_batch->bat_session; + struct srpc_client_rpc *rpc; + struct srpc_brw_reqst *req; + int flags; + int npg; + int len; + int off; + int opc; + int rc; LASSERT(sn != NULL); LASSERT(bulk != NULL); if ((sn->sn_features & LST_FEAT_BULK_LEN) == 0) { - test_bulk_req_t *breq = &tsi->tsi_u.bulk_v0; + struct test_bulk_req *breq = &tsi->tsi_u.bulk_v0; opc = breq->blk_opc; flags = breq->blk_flags; - npg = breq->blk_npg; - len = npg * PAGE_CACHE_SIZE; + len = breq->blk_npg * PAGE_SIZE; + off = 0; } else { - test_bulk_req_v1_t *breq = &tsi->tsi_u.bulk_v1; + struct test_bulk_req_v1 *breq = &tsi->tsi_u.bulk_v1; + int off; /* I should never get this step if it's unknown feature * because make_session will reject unknown feature */ @@ -295,14 +282,17 @@ brw_client_prep_rpc (sfw_test_unit_t *tsu, opc = breq->blk_opc; flags = breq->blk_flags; len = breq->blk_len; - npg = (len + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; + off = breq->blk_offset; } + npg = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT; rc = sfw_create_test_rpc(tsu, dest, sn->sn_features, npg, len, &rpc); if (rc != 0) return rc; - memcpy(&rpc->crpc_bulk, bulk, offsetof(srpc_bulk_t, bk_iovs[npg])); + unsafe_memcpy(&rpc->crpc_bulk, bulk, + offsetof(struct srpc_bulk, bk_iovs[npg]), + FLEXIBLE_OBJECT); if (opc == LST_BRW_WRITE) brw_fill_bulk(&rpc->crpc_bulk, flags, BRW_MAGIC); else @@ -318,82 +308,76 @@ brw_client_prep_rpc (sfw_test_unit_t *tsu, } static void -brw_client_done_rpc (sfw_test_unit_t *tsu, srpc_client_rpc_t *rpc) +brw_client_done_rpc(struct sfw_test_unit *tsu, struct srpc_client_rpc *rpc) { - __u64 magic = BRW_MAGIC; - sfw_test_instance_t *tsi = tsu->tsu_instance; - sfw_session_t *sn = tsi->tsi_batch->bat_session; - srpc_msg_t *msg = &rpc->crpc_replymsg; - srpc_brw_reply_t *reply = &msg->msg_body.brw_reply; - srpc_brw_reqst_t *reqst = &rpc->crpc_reqstmsg.msg_body.brw_reqst; - - LASSERT (sn != NULL); - - if (rpc->crpc_status != 0) { - CERROR ("BRW RPC to %s failed with %d\n", - libcfs_id2str(rpc->crpc_dest), rpc->crpc_status); - if (!tsi->tsi_stopping) /* rpc could have been aborted */ - cfs_atomic_inc(&sn->sn_brw_errors); - goto out; - } + __u64 magic = BRW_MAGIC; + struct sfw_test_instance *tsi = tsu->tsu_instance; + struct sfw_session *sn = tsi->tsi_batch->bat_session; + struct srpc_msg *msg = &rpc->crpc_replymsg; + struct srpc_brw_reply *reply = &msg->msg_body.brw_reply; + struct srpc_brw_reqst *reqst = &rpc->crpc_reqstmsg.msg_body.brw_reqst; - if (msg->msg_magic != SRPC_MSG_MAGIC) { - __swab64s(&magic); - __swab32s(&reply->brw_status); - } + LASSERT(sn != NULL); + + if (rpc->crpc_status != 0) { + CERROR("BRW RPC to %s failed with %d\n", + libcfs_id2str(rpc->crpc_dest), rpc->crpc_status); + if (!tsi->tsi_stopping) /* rpc could have been aborted */ + atomic_inc(&sn->sn_brw_errors); + return; + } - CDEBUG (reply->brw_status ? D_WARNING : D_NET, - "BRW RPC to %s finished with brw_status: %d\n", - libcfs_id2str(rpc->crpc_dest), reply->brw_status); + if (msg->msg_magic != SRPC_MSG_MAGIC) { + __swab64s(&magic); + __swab32s(&reply->brw_status); + } - if (reply->brw_status != 0) { - cfs_atomic_inc(&sn->sn_brw_errors); - rpc->crpc_status = -(int)reply->brw_status; - goto out; - } + CDEBUG(reply->brw_status ? D_WARNING : D_NET, + "BRW RPC to %s finished with brw_status: %d\n", + libcfs_id2str(rpc->crpc_dest), reply->brw_status); - if (reqst->brw_rw == LST_BRW_WRITE) goto out; + if (reply->brw_status != 0) { + atomic_inc(&sn->sn_brw_errors); + rpc->crpc_status = -(int)reply->brw_status; + return; + } - if (brw_check_bulk(&rpc->crpc_bulk, reqst->brw_flags, magic) != 0) { - CERROR ("Bulk data from %s is corrupted!\n", - libcfs_id2str(rpc->crpc_dest)); - cfs_atomic_inc(&sn->sn_brw_errors); - rpc->crpc_status = -EBADMSG; - } + if (reqst->brw_rw == LST_BRW_WRITE) + return; -out: -#ifndef __KERNEL__ - rpc->crpc_bulk.bk_pages = NULL; -#endif - return; + if (brw_check_bulk(&rpc->crpc_bulk, reqst->brw_flags, magic) != 0) { + CERROR("Bulk data from %s is corrupted!\n", + libcfs_id2str(rpc->crpc_dest)); + atomic_inc(&sn->sn_brw_errors); + rpc->crpc_status = -EBADMSG; + } } -void -brw_server_rpc_done (srpc_server_rpc_t *rpc) +static void +brw_server_rpc_done(struct srpc_server_rpc *rpc) { - srpc_bulk_t *blk = rpc->srpc_bulk; - - if (blk == NULL) return; + struct srpc_bulk *blk = rpc->srpc_bulk; - if (rpc->srpc_status != 0) - CERROR ("Bulk transfer %s %s has failed: %d\n", - blk->bk_sink ? "from" : "to", - libcfs_id2str(rpc->srpc_peer), rpc->srpc_status); - else - CDEBUG (D_NET, "Transfered %d pages bulk data %s %s\n", - blk->bk_niov, blk->bk_sink ? "from" : "to", - libcfs_id2str(rpc->srpc_peer)); + if (blk == NULL) + return; - sfw_free_pages(rpc); + if (rpc->srpc_status != 0) + CERROR("Bulk transfer %s %s has failed: %d\n", + blk->bk_sink ? "from" : "to", + libcfs_id2str(rpc->srpc_peer), rpc->srpc_status); + else + CDEBUG(D_NET, "Transferred %d pages bulk data %s %s\n", + blk->bk_niov, blk->bk_sink ? "from" : "to", + libcfs_id2str(rpc->srpc_peer)); } -int -brw_bulk_ready (srpc_server_rpc_t *rpc, int status) +static int +brw_bulk_ready(struct srpc_server_rpc *rpc, int status) { - __u64 magic = BRW_MAGIC; - srpc_brw_reply_t *reply = &rpc->srpc_replymsg.msg_body.brw_reply; - srpc_brw_reqst_t *reqst; - srpc_msg_t *reqstmsg; + __u64 magic = BRW_MAGIC; + struct srpc_brw_reply *reply = &rpc->srpc_replymsg.msg_body.brw_reply; + struct srpc_brw_reqst *reqst; + struct srpc_msg *reqstmsg; LASSERT (rpc->srpc_bulk != NULL); LASSERT (rpc->srpc_reqstbuf != NULL); @@ -423,16 +407,14 @@ brw_bulk_ready (srpc_server_rpc_t *rpc, int status) return 0; } -int +static int brw_server_handle(struct srpc_server_rpc *rpc) { - struct srpc_service *sv = rpc->srpc_scd->scd_svc; - srpc_msg_t *replymsg = &rpc->srpc_replymsg; - srpc_msg_t *reqstmsg = &rpc->srpc_reqstbuf->buf_msg; - srpc_brw_reply_t *reply = &replymsg->msg_body.brw_reply; - srpc_brw_reqst_t *reqst = &reqstmsg->msg_body.brw_reqst; - int npg; - int rc; + struct srpc_service *sv = rpc->srpc_scd->scd_svc; + struct srpc_msg *replymsg = &rpc->srpc_replymsg; + struct srpc_msg *reqstmsg = &rpc->srpc_reqstbuf->buf_msg; + struct srpc_brw_reply *reply = &replymsg->msg_body.brw_reply; + struct srpc_brw_reqst *reqst = &reqstmsg->msg_body.brw_reqst; LASSERT (sv->sv_id == SRPC_SERVICE_BRW); @@ -466,59 +448,76 @@ brw_server_handle(struct srpc_server_rpc *rpc) if ((reqstmsg->msg_ses_feats & LST_FEAT_BULK_LEN) == 0) { /* compat with old version */ - if ((reqst->brw_len & ~CFS_PAGE_MASK) != 0) { + if ((reqst->brw_len & ~PAGE_MASK) != 0) { reply->brw_status = EINVAL; return 0; } - npg = reqst->brw_len >> PAGE_CACHE_SHIFT; - - } else { - npg = (reqst->brw_len + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; } replymsg->msg_ses_feats = reqstmsg->msg_ses_feats; - if (reqst->brw_len == 0 || npg > LNET_MAX_IOV) { + if (reqst->brw_len == 0 || reqst->brw_len > LNET_MTU) { reply->brw_status = EINVAL; 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, 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; } -sfw_test_client_ops_t brw_test_client; -void brw_init_test_client(void) +static int +brw_srpc_init(struct srpc_server_rpc *rpc, int cpt) { - 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; + /* just alloc a maximal size - actual values will be adjusted later */ + rpc->srpc_bulk = srpc_alloc_bulk(cpt, LNET_MTU); + if (rpc->srpc_bulk == NULL) + return -ENOMEM; + + srpc_init_bulk(rpc->srpc_bulk, 0, 0, 0); + + return 0; +} + +static void +brw_srpc_fini(struct srpc_server_rpc *rpc) +{ + 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 = { + .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, }; -srpc_service_t brw_test_service; void brw_init_test_service(void) { -#ifndef __KERNEL__ - char *s; + unsigned long cache_size = cfs_totalram_pages() >> 4; - s = getenv("BRW_INJECT_ERRORS"); - brw_inject_errors = s != NULL ? atoi(s) : brw_inject_errors; -#endif + /* brw prealloc cache should don't eat more than half memory */ + cache_size /= ((LNET_MTU >> PAGE_SHIFT) + 1) ; - 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; 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; }