diff --git a/module/bdev/compress/vbdev_compress.c b/module/bdev/compress/vbdev_compress.c index 6ac5ffae7..a83c97c64 100644 --- a/module/bdev/compress/vbdev_compress.c +++ b/module/bdev/compress/vbdev_compress.c @@ -188,7 +188,7 @@ static struct rte_comp_xform g_decomp_xform = { static void vbdev_compress_examine(struct spdk_bdev *bdev); static void vbdev_compress_claim(struct vbdev_compress *comp_bdev); static void vbdev_compress_queue_io(struct spdk_bdev_io *bdev_io); -struct vbdev_compress *_prepare_for_load_init(struct spdk_bdev *bdev); +struct vbdev_compress *_prepare_for_load_init(struct spdk_bdev *bdev, uint32_t lb_size); static void vbdev_compress_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io); static void comp_bdev_ch_destroy_cb(void *io_device, void *ctx_buf); static void vbdev_compress_delete_done(void *cb_arg, int bdeverrno); @@ -1284,7 +1284,7 @@ vbdev_compress_base_bdev_hotremove_cb(void *ctx) * information for reducelib to init or load. */ struct vbdev_compress * -_prepare_for_load_init(struct spdk_bdev *bdev) +_prepare_for_load_init(struct spdk_bdev *bdev, uint32_t lb_size) { struct vbdev_compress *meta_ctx; @@ -1306,7 +1306,12 @@ _prepare_for_load_init(struct spdk_bdev *bdev) meta_ctx->backing_dev.blockcnt = bdev->blockcnt; meta_ctx->params.chunk_size = CHUNK_SIZE; - meta_ctx->params.logical_block_size = bdev->blocklen; + if (lb_size == 0) { + meta_ctx->params.logical_block_size = bdev->blocklen; + } else { + meta_ctx->params.logical_block_size = lb_size; + } + meta_ctx->params.backing_io_unit_size = BACKING_IO_SZ; return meta_ctx; } @@ -1334,12 +1339,12 @@ _set_pmd(struct vbdev_compress *comp_dev) /* Call reducelib to initialize a new volume */ static int -vbdev_init_reduce(struct spdk_bdev *bdev, const char *pm_path) +vbdev_init_reduce(struct spdk_bdev *bdev, const char *pm_path, uint32_t lb_size) { struct vbdev_compress *meta_ctx; int rc; - meta_ctx = _prepare_for_load_init(bdev); + meta_ctx = _prepare_for_load_init(bdev, lb_size); if (meta_ctx == NULL) { return -EINVAL; } @@ -1471,7 +1476,7 @@ comp_bdev_ch_destroy_cb(void *io_device, void *ctx_buf) /* RPC entry point for compression vbdev creation. */ int -create_compress_bdev(const char *bdev_name, const char *pm_path) +create_compress_bdev(const char *bdev_name, const char *pm_path, uint32_t lb_size) { struct spdk_bdev *bdev; @@ -1480,7 +1485,12 @@ create_compress_bdev(const char *bdev_name, const char *pm_path) return -ENODEV; } - return vbdev_init_reduce(bdev, pm_path);; + if ((lb_size != 0) && (lb_size != LB_SIZE_4K) && (lb_size != LB_SIZE_512B)) { + SPDK_ERRLOG("Logical block size must be 512 or 4096\n"); + return -EINVAL; + } + + return vbdev_init_reduce(bdev, pm_path, lb_size); } /* On init, just init the compress drivers. All metadata is stored on disk. */ @@ -1822,7 +1832,7 @@ vbdev_compress_examine(struct spdk_bdev *bdev) return; } - meta_ctx = _prepare_for_load_init(bdev); + meta_ctx = _prepare_for_load_init(bdev, 0); if (meta_ctx == NULL) { spdk_bdev_module_examine_done(&compress_if); return; diff --git a/module/bdev/compress/vbdev_compress.h b/module/bdev/compress/vbdev_compress.h index 1b5061a2d..4dcd78f60 100644 --- a/module/bdev/compress/vbdev_compress.h +++ b/module/bdev/compress/vbdev_compress.h @@ -38,6 +38,9 @@ #include "spdk/bdev.h" +#define LB_SIZE_4K 0x1000UL +#define LB_SIZE_512B 0x200UL + /** * Get the first compression bdev. * @@ -85,9 +88,10 @@ typedef void (*spdk_delete_compress_complete)(void *cb_arg, int bdeverrno); * * \param bdev_name Bdev on which compression bdev will be created. * \param pm_path Path to persistent memory. + * \param lb_size Logical block size for the compressed volume in bytes. Must be 4K or 512. * \return 0 on success, other on failure. */ -int create_compress_bdev(const char *bdev_name, const char *pm_path); +int create_compress_bdev(const char *bdev_name, const char *pm_path, uint32_t lb_size); /** * Delete compress bdev. diff --git a/module/bdev/compress/vbdev_compress_rpc.c b/module/bdev/compress/vbdev_compress_rpc.c index 9bdb25650..9eedae066 100644 --- a/module/bdev/compress/vbdev_compress_rpc.c +++ b/module/bdev/compress/vbdev_compress_rpc.c @@ -149,6 +149,7 @@ SPDK_RPC_REGISTER_ALIAS_DEPRECATED(compress_set_pmd, set_compress_pmd) struct rpc_construct_compress { char *base_bdev_name; char *pm_path; + uint32_t lb_size; }; /* Free the allocated memory resource after the RPC handling. */ @@ -163,6 +164,7 @@ free_rpc_construct_compress(struct rpc_construct_compress *r) static const struct spdk_json_object_decoder rpc_construct_compress_decoders[] = { {"base_bdev_name", offsetof(struct rpc_construct_compress, base_bdev_name), spdk_json_decode_string}, {"pm_path", offsetof(struct rpc_construct_compress, pm_path), spdk_json_decode_string}, + {"lb_size", offsetof(struct rpc_construct_compress, lb_size), spdk_json_decode_uint32}, }; /* Decode the parameters for this RPC method and properly construct the compress @@ -181,12 +183,12 @@ rpc_bdev_compress_create(struct spdk_jsonrpc_request *request, SPDK_COUNTOF(rpc_construct_compress_decoders), &req)) { SPDK_DEBUGLOG(SPDK_LOG_VBDEV_COMPRESS, "spdk_json_decode_object failed\n"); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, "spdk_json_decode_object failed"); goto cleanup; } - rc = create_compress_bdev(req.base_bdev_name, req.pm_path); + rc = create_compress_bdev(req.base_bdev_name, req.pm_path, req.lb_size); if (rc != 0) { spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); goto cleanup; diff --git a/scripts/rpc.py b/scripts/rpc.py index 84c502fe6..140bfefd9 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -177,12 +177,14 @@ if __name__ == "__main__": def bdev_compress_create(args): print_json(rpc.bdev.bdev_compress_create(args.client, base_bdev_name=args.base_bdev_name, - pm_path=args.pm_path)) + pm_path=args.pm_path, + lb_size=args.lb_size)) p = subparsers.add_parser('bdev_compress_create', aliases=['construct_compress_bdev'], help='Add a compress vbdev') p.add_argument('-b', '--base_bdev_name', help="Name of the base bdev") p.add_argument('-p', '--pm_path', help="Path to persistent memory") + p.add_argument('-l', '--lb_size', help="Compressed vol logical block size (optional, if used must be 512 or 4096)", type=int, default=0) p.set_defaults(func=bdev_compress_create) def bdev_compress_delete(args): diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index 60bd8ffd5..8c669c0b2 100644 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -23,17 +23,18 @@ def bdev_set_options(client, bdev_io_pool_size=None, bdev_io_cache_size=None, bd @deprecated_alias('construct_compress_bdev') -def bdev_compress_create(client, base_bdev_name, pm_path): +def bdev_compress_create(client, base_bdev_name, pm_path, lb_size): """Construct a compress virtual block device. Args: base_bdev_name: name of the underlying base bdev pm_path: path to persistent memory + lb_size: logical block size for the compressed vol in bytes. Must be 4K or 512. Returns: Name of created virtual block device. """ - params = {'base_bdev_name': base_bdev_name, 'pm_path': pm_path} + params = {'base_bdev_name': base_bdev_name, 'pm_path': pm_path, 'lb_size': lb_size} return client.call('bdev_compress_create', params) diff --git a/test/compress/compress.sh b/test/compress/compress.sh index fea26aab8..0c67f7021 100755 --- a/test/compress/compress.sh +++ b/test/compress/compress.sh @@ -33,7 +33,11 @@ function create_vols() { waitforbdev lvs0/lv0 $rpc_py compress_set_pmd -p "$pmd" - $rpc_py bdev_compress_create -b lvs0/lv0 -p /tmp/pmem + if [ -z "$1" ]; then + $rpc_py bdev_compress_create -b lvs0/lv0 -p /tmp/pmem + else + $rpc_py bdev_compress_create -b lvs0/lv0 -p /tmp/pmem -l $1 + fi waitforbdev COMP_lvs0/lv0 } @@ -54,7 +58,7 @@ function run_bdevperf() { bdevperf_pid=$! trap 'killprocess $bdevperf_pid; error_cleanup; exit 1' SIGINT SIGTERM EXIT waitforlisten $bdevperf_pid - create_vols + create_vols $4 $rootdir/test/bdev/bdevperf/bdevperf.py perform_tests destroy_vols trap - SIGINT SIGTERM EXIT @@ -78,7 +82,10 @@ esac mkdir -p /tmp/pmem # per patch bdevperf uses slightly different params than nightly +# logical block size same as underlying device, then 512 then 4096 run_bdevperf 32 4096 3 +run_bdevperf 32 4096 3 512 +run_bdevperf 32 4096 3 4096 if [ $RUN_NIGHTLY -eq 1 ]; then run_bdevio