From: Amir Shehata Date: Thu, 6 Feb 2020 04:23:20 +0000 (-0800) Subject: EX-773 lustre: Support RDMA only pages X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=3bf0614314493d4cc8d9039a0203141ea7060f97;p=fs%2Flustre-release.git EX-773 lustre: Support RDMA only pages Some memory architectures and CPU-offload cards with on-board memory do not map data pages into the CPU address space. Allow RDMA of data directly into those pages without accessing contents. Therefore, made changes to prevent doing checksum on these type of pages. Signed-off-by: Wang Shilong Signed-off-by: Amir Shehata Change-Id: I189c34893ffa500ed275f2a1f79e8fb817a2489d Reviewed-on: https://review.whamcloud.com/37454 Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo Reviewed-on: https://review.whamcloud.com/42002 Reviewed-by: Wang Shilong --- diff --git a/lustre/include/lustre_osc.h b/lustre/include/lustre_osc.h index de848ae..08b1aeb 100644 --- a/lustre/include/lustre_osc.h +++ b/lustre/include/lustre_osc.h @@ -936,8 +936,9 @@ struct osc_extent { oe_ndelay:1, /** direct IO pages */ oe_dio:1, - /** this extent consists of RDMA only pages */ - oe_is_rdma_only; + /** this extent consists of pages that are not directly accessible + * from the CPU */ + oe_is_rdma_only:1; /** how many grants allocated for this extent. * Grant allocated for this extent. There is no grant allocated * for reading extents and sync write extents. */ diff --git a/lustre/osc/osc_io.c b/lustre/osc/osc_io.c index 47e56a7..b0597e5 100644 --- a/lustre/osc/osc_io.c +++ b/lustre/osc/osc_io.c @@ -43,6 +43,7 @@ #include #include "osc_internal.h" +#include /** \addtogroup osc * @{ @@ -147,6 +148,8 @@ int osc_io_submit(const struct lu_env *env, const struct cl_io_slice *ios, page = cl_page_list_first(qin); if (page->cp_type == CPT_TRANSIENT) brw_flags |= OBD_BRW_NOCACHE; + if (lnet_is_rdma_only_page(page->cp_vmpage)) + brw_flags |= OBD_BRW_RDMA_ONLY; /* * NOTE: here @page is a top-level page. This is done to avoid diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c index 6dbfcee..c68382b 100644 --- a/lustre/osc/osc_request.c +++ b/lustre/osc/osc_request.c @@ -48,8 +48,8 @@ #include #include #include - #include "osc_internal.h" +#include atomic_t osc_pool_req_count; unsigned int osc_reqpool_maxreqcount; @@ -1399,6 +1399,7 @@ osc_brw_prep_request(int cmd, struct client_obd *cli, struct obdo *oa, const char *obd_name = cli->cl_import->imp_obd->obd_name; struct inode *inode; bool directio = false; + bool enable_checksum = true; ENTRY; inode = page2inode(pga[0]->pg); @@ -1540,6 +1541,11 @@ retry_encrypt: } } + if (lnet_is_rdma_only_page(pga[0]->pg)) { + enable_checksum = false; + short_io_size = 0; + } + /* Check if read/write is small enough to be a short io. */ if (short_io_size > cli->cl_max_short_io_bytes || niocount > 1 || !imp_connect_shortio(cli->cl_import)) @@ -1689,10 +1695,12 @@ no_bulk: if (osc_should_shrink_grant(cli)) osc_shrink_grant_local(cli, &body->oa); + if (!cli->cl_checksum || sptlrpc_flavor_has_bulk(&req->rq_flvr)) + enable_checksum = false; + /* size[REQ_REC_OFF] still sizeof (*body) */ if (opc == OST_WRITE) { - if (cli->cl_checksum && - !sptlrpc_flavor_has_bulk(&req->rq_flvr)) { + if (enable_checksum) { /* store cl_cksum_type in a local variable since * it can be changed via lprocfs */ enum cksum_types cksum_type = cli->cl_cksum_type; @@ -1730,8 +1738,7 @@ no_bulk: req_capsule_set_size(pill, &RMF_RCS, RCL_SERVER, sizeof(__u32) * niocount); } else { - if (cli->cl_checksum && - !sptlrpc_flavor_has_bulk(&req->rq_flvr)) { + if (enable_checksum) { if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0) body->oa.o_flags = 0; body->oa.o_flags |= obd_cksum_type_pack(obd_name,