Lines Matching defs:comp_bdev

43 	struct spdk_bdev		comp_bdev;	/* the compression virtual bdev */
55 bool orphaned; /* base bdev claimed but comp_bdev not registered */
75 struct vbdev_compress *comp_bdev; /* vbdev associated with this IO */
82 static int vbdev_compress_claim(struct vbdev_compress *comp_bdev);
132 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(backing_dev, struct vbdev_compress,
138 rc = spdk_accel_submit_compress_ext(comp_bdev->accel_channel, dst_iovs[0].iov_base,
140 comp_bdev->comp_algo, comp_bdev->comp_level,
144 rc = spdk_accel_submit_decompress_ext(comp_bdev->accel_channel, dst_iovs, dst_iovcnt,
145 src_iovs, src_iovcnt, comp_bdev->comp_algo,
189 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(bdev_io->bdev, struct vbdev_compress,
190 comp_bdev);
192 spdk_reduce_vol_writev(comp_bdev->vol, bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
201 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(bdev_io->bdev, struct vbdev_compress,
202 comp_bdev);
204 spdk_reduce_vol_readv(comp_bdev->vol, bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
217 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(bdev_io->bdev, struct vbdev_compress,
218 comp_bdev);
226 spdk_thread_exec_msg(comp_bdev->reduce_thread, _comp_submit_read, bdev_io);
267 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(bdev_io->bdev, struct vbdev_compress,
268 comp_bdev);
288 spdk_reduce_vol_unmap(comp_bdev->vol,
298 spdk_reduce_vol_unmap(comp_bdev->vol,
341 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(bdev_io->bdev, struct vbdev_compress,
342 comp_bdev);
343 const struct spdk_reduce_vol_params *vol_params = spdk_reduce_vol_get_params(comp_bdev->vol);
417 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(bdev_io->bdev, struct vbdev_compress,
418 comp_bdev);
422 io_ctx->comp_bdev = comp_bdev;
432 spdk_thread_exec_msg(comp_bdev->reduce_thread, _comp_submit_write, bdev_io);
435 spdk_thread_exec_msg(comp_bdev->reduce_thread, _comp_submit_unmap, bdev_io);
451 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)ctx;
456 return spdk_bdev_io_type_supported(comp_bdev->base_bdev, io_type);
471 struct vbdev_compress *comp_bdev = io_device;
473 /* Done with this comp_bdev. */
474 pthread_mutex_destroy(&comp_bdev->reduce_lock);
475 free(comp_bdev->comp_bdev.name);
476 free(comp_bdev);
482 struct vbdev_compress *comp_bdev = ctx;
485 spdk_bdev_close(comp_bdev->base_desc);
486 comp_bdev->vol = NULL;
487 if (comp_bdev->init_failed) {
488 free(comp_bdev);
492 TAILQ_REMOVE(&g_vbdev_comp, comp_bdev, link);
493 spdk_bdev_module_release_bdev(comp_bdev->base_bdev);
495 if (comp_bdev->orphaned == false) {
496 spdk_io_device_unregister(comp_bdev, _device_unregister_cb);
498 vbdev_compress_delete_done(comp_bdev->delete_ctx, 0);
499 _device_unregister_cb(comp_bdev);
506 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)cb_arg;
511 if (comp_bdev->thread && comp_bdev->thread != spdk_get_thread()) {
512 spdk_thread_send_msg(comp_bdev->thread,
513 _vbdev_compress_destruct_cb, comp_bdev);
515 _vbdev_compress_destruct_cb(comp_bdev);
523 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)ctx;
529 comp_bdev->vol = NULL;
530 spdk_put_io_channel(comp_bdev->base_ch);
531 if (comp_bdev->init_failed || comp_bdev->orphaned) {
532 vbdev_compress_destruct_cb((void *)comp_bdev, 0);
534 spdk_bdev_unregister(&comp_bdev->comp_bdev, vbdev_compress_delete_done,
535 comp_bdev->delete_ctx);
543 struct vbdev_compress *comp_bdev = ctx;
546 assert(!comp_bdev->reduce_thread ||
547 comp_bdev->reduce_thread == spdk_get_thread());
550 comp_bdev->base_ch = spdk_bdev_get_io_channel(comp_bdev->base_desc);
553 spdk_reduce_vol_destroy(&comp_bdev->backing_dev, _reduce_destroy_cb, comp_bdev);
560 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)cb_arg;
564 vbdev_compress_delete_done(comp_bdev->delete_ctx, reduce_errno);
568 pthread_mutex_lock(&comp_bdev->reduce_lock);
569 if (comp_bdev->reduce_thread && comp_bdev->reduce_thread != spdk_get_thread()) {
570 spdk_thread_send_msg(comp_bdev->reduce_thread,
571 _delete_vol_unload_cb, comp_bdev);
572 pthread_mutex_unlock(&comp_bdev->reduce_lock);
574 pthread_mutex_unlock(&comp_bdev->reduce_lock);
576 _delete_vol_unload_cb(comp_bdev);
581 compress_get_name(const struct vbdev_compress *comp_bdev)
583 return comp_bdev->comp_bdev.name;
589 struct vbdev_compress *comp_bdev;
591 comp_bdev = TAILQ_FIRST(&g_vbdev_comp);
593 return comp_bdev;
599 struct vbdev_compress *comp_bdev;
601 comp_bdev = TAILQ_NEXT(prev, link);
603 return comp_bdev;
609 struct vbdev_compress *comp_bdev;
611 TAILQ_FOREACH(comp_bdev, &g_vbdev_comp, link) {
612 if (comp_bdev->orphaned && strcmp(name, comp_bdev->comp_bdev.name) == 0) {
625 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)ctx;
627 if (comp_bdev->vol != NULL) {
629 spdk_reduce_vol_unload(comp_bdev->vol, vbdev_compress_destruct_cb, comp_bdev);
631 vbdev_compress_destruct_cb(comp_bdev, 0);
643 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)ctx;
651 return spdk_get_io_channel(comp_bdev);
658 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)ctx;
662 if (comp_bdev->params.comp_algo == SPDK_ACCEL_COMP_ALGO_LZ4) {
664 } else if (comp_bdev->params.comp_algo == SPDK_ACCEL_COMP_ALGO_DEFLATE) {
672 spdk_json_write_named_string(w, "name", spdk_bdev_get_name(&comp_bdev->comp_bdev));
673 spdk_json_write_named_string(w, "base_bdev_name", spdk_bdev_get_name(comp_bdev->base_bdev));
674 spdk_json_write_named_string(w, "pm_path", spdk_reduce_vol_get_pm_path(comp_bdev->vol));
676 spdk_json_write_named_uint32(w, "comp_level", comp_bdev->params.comp_level);
677 spdk_json_write_named_uint32(w, "chunk_size", comp_bdev->params.chunk_size);
678 spdk_json_write_named_uint32(w, "backing_io_unit_size", comp_bdev->params.backing_io_unit_size);
679 vol_info = spdk_reduce_vol_get_info(comp_bdev->vol);
694 struct vbdev_compress *comp_bdev;
703 struct vbdev_compress *comp_bdev = ctx;
705 assert(!comp_bdev->reduce_thread ||
706 comp_bdev->reduce_thread == spdk_get_thread());
708 comp_bdev->base_ch = spdk_bdev_get_io_channel(comp_bdev->base_desc);
710 spdk_reduce_vol_destroy(&comp_bdev->backing_dev, _reduce_destroy_cb, comp_bdev);
716 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)ctx;
722 pthread_mutex_lock(&comp_bdev->reduce_lock);
723 if (comp_bdev->reduce_thread && comp_bdev->reduce_thread != spdk_get_thread()) {
724 spdk_thread_send_msg(comp_bdev->reduce_thread,
725 _cleanup_vol_unload_cb, comp_bdev);
726 pthread_mutex_unlock(&comp_bdev->reduce_lock);
728 pthread_mutex_unlock(&comp_bdev->reduce_lock);
730 _cleanup_vol_unload_cb(comp_bdev);
738 struct vbdev_compress *comp_bdev = init_ctx->comp_bdev;
741 assert(comp_bdev->base_desc != NULL);
744 spdk_put_io_channel(comp_bdev->base_ch);
750 assert(comp_bdev->vol != NULL);
752 rc = vbdev_compress_claim(comp_bdev);
754 comp_bdev->init_failed = true;
755 spdk_reduce_vol_unload(comp_bdev->vol, init_vol_unload_cb, comp_bdev);
765 spdk_bdev_close(comp_bdev->base_desc);
766 free(comp_bdev);
778 struct vbdev_compress *comp_bdev = init_ctx->comp_bdev;
781 comp_bdev->vol = vol;
784 spdk_bdev_get_name(comp_bdev->base_bdev), spdk_strerror(-reduce_errno));
789 if (comp_bdev->thread && comp_bdev->thread != spdk_get_thread()) {
790 spdk_thread_send_msg(comp_bdev->thread, _vbdev_reduce_init_cb, init_ctx);
816 _comp_backing_bdev_queue_io_wait(struct vbdev_compress *comp_bdev,
823 waitq_entry->bdev = spdk_bdev_desc_get_bdev(comp_bdev->base_desc);
827 rc = spdk_bdev_queue_io_wait(waitq_entry->bdev, comp_bdev->base_ch, waitq_entry);
839 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(backing_io->dev, struct vbdev_compress,
843 rc = spdk_bdev_readv_blocks(comp_bdev->base_desc, comp_bdev->base_ch,
851 _comp_backing_bdev_queue_io_wait(comp_bdev, backing_io);
864 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(backing_io->dev, struct vbdev_compress,
868 rc = spdk_bdev_writev_blocks(comp_bdev->base_desc, comp_bdev->base_ch,
876 _comp_backing_bdev_queue_io_wait(comp_bdev, backing_io);
889 struct vbdev_compress *comp_bdev = SPDK_CONTAINEROF(backing_io->dev, struct vbdev_compress,
893 rc = spdk_bdev_unmap_blocks(comp_bdev->base_desc, comp_bdev->base_ch,
900 _comp_backing_bdev_queue_io_wait(comp_bdev, backing_io);
944 struct vbdev_compress *comp_bdev = (struct vbdev_compress *)cb_arg;
950 comp_bdev->vol = NULL;
951 spdk_bdev_unregister(&comp_bdev->comp_bdev, NULL, NULL);
957 struct vbdev_compress *comp_bdev, *tmp;
959 TAILQ_FOREACH_SAFE(comp_bdev, &g_vbdev_comp, link, tmp) {
960 if (bdev_find == comp_bdev->base_bdev) {
962 spdk_reduce_vol_unload(comp_bdev->vol, bdev_hotremove_vol_unload_cb, comp_bdev);
996 struct vbdev_compress *comp_bdev;
999 comp_bdev = calloc(1, sizeof(struct vbdev_compress));
1000 if (comp_bdev == NULL) {
1001 SPDK_ERRLOG("failed to alloc comp_bdev\n");
1005 comp_bdev->backing_dev.submit_backing_io = _comp_reduce_submit_backing_io;
1006 comp_bdev->backing_dev.compress = _comp_reduce_compress;
1007 comp_bdev->backing_dev.decompress = _comp_reduce_decompress;
1009 comp_bdev->base_desc = bdev_desc;
1011 comp_bdev->base_bdev = bdev;
1013 comp_bdev->backing_dev.blocklen = bdev->blocklen;
1014 comp_bdev->backing_dev.blockcnt = bdev->blockcnt;
1016 comp_bdev->backing_dev.user_ctx_size = sizeof(struct spdk_bdev_io_wait_entry);
1018 comp_bdev->comp_algo = comp_algo;
1019 comp_bdev->comp_level = comp_level;
1020 comp_bdev->params.comp_algo = comp_algo;
1021 comp_bdev->params.comp_level = comp_level;
1022 comp_bdev->params.chunk_size = CHUNK_SIZE;
1024 comp_bdev->params.logical_block_size = bdev->blocklen;
1026 comp_bdev->params.logical_block_size = lb_size;
1029 comp_bdev->params.backing_io_unit_size = BACKING_IO_SZ;
1030 return comp_bdev;
1040 struct vbdev_compress *comp_bdev;
1060 comp_bdev = _prepare_for_load_init(bdev_desc, lb_size, comp_algo, comp_level);
1061 if (comp_bdev == NULL) {
1067 init_ctx->comp_bdev = comp_bdev;
1070 comp_bdev->thread = spdk_get_thread();
1072 comp_bdev->base_ch = spdk_bdev_get_io_channel(comp_bdev->base_desc);
1074 spdk_reduce_vol_init(&comp_bdev->params, &comp_bdev->backing_dev,
1090 struct vbdev_compress *comp_bdev = io_device;
1093 pthread_mutex_lock(&comp_bdev->reduce_lock);
1094 if (comp_bdev->ch_count == 0) {
1096 TAILQ_INIT(&comp_bdev->pending_comp_ios);
1099 TAILQ_INIT(&comp_bdev->queued_comp_ops);
1101 comp_bdev->base_ch = spdk_bdev_get_io_channel(comp_bdev->base_desc);
1102 comp_bdev->reduce_thread = spdk_get_thread();
1103 comp_bdev->accel_channel = spdk_accel_get_io_channel();
1105 comp_bdev->ch_count++;
1106 pthread_mutex_unlock(&comp_bdev->reduce_lock);
1112 _channel_cleanup(struct vbdev_compress *comp_bdev)
1114 spdk_put_io_channel(comp_bdev->base_ch);
1115 spdk_put_io_channel(comp_bdev->accel_channel);
1116 comp_bdev->reduce_thread = NULL;
1123 struct vbdev_compress *comp_bdev = arg;
1125 pthread_mutex_lock(&comp_bdev->reduce_lock);
1126 _channel_cleanup(comp_bdev);
1127 pthread_mutex_unlock(&comp_bdev->reduce_lock);
1137 struct vbdev_compress *comp_bdev = io_device;
1139 pthread_mutex_lock(&comp_bdev->reduce_lock);
1140 comp_bdev->ch_count--;
1141 if (comp_bdev->ch_count == 0) {
1143 if (comp_bdev->reduce_thread != spdk_get_thread()) {
1144 spdk_thread_send_msg(comp_bdev->reduce_thread,
1145 _comp_bdev_ch_destroy_cb, comp_bdev);
1147 _channel_cleanup(comp_bdev);
1150 pthread_mutex_unlock(&comp_bdev->reduce_lock);
1184 struct vbdev_compress *comp_bdev = NULL;
1208 TAILQ_FOREACH(comp_bdev, &g_vbdev_comp, link) {
1209 if (strcmp(bdev_name, comp_bdev->base_bdev->name) == 0) {
1261 static int _set_compbdev_name(struct vbdev_compress *comp_bdev)
1265 if (!TAILQ_EMPTY(spdk_bdev_get_aliases(comp_bdev->base_bdev))) {
1266 aliases = TAILQ_FIRST(spdk_bdev_get_aliases(comp_bdev->base_bdev));
1267 comp_bdev->comp_bdev.name = spdk_sprintf_alloc("COMP_%s", aliases->alias.name);
1268 if (!comp_bdev->comp_bdev.name) {
1269 SPDK_ERRLOG("could not allocate comp_bdev name for alias\n");
1273 comp_bdev->comp_bdev.name = spdk_sprintf_alloc("COMP_%s", comp_bdev->base_bdev->name);
1274 if (!comp_bdev->comp_bdev.name) {
1275 SPDK_ERRLOG("could not allocate comp_bdev name for unique name\n");
1283 vbdev_compress_claim(struct vbdev_compress *comp_bdev)
1288 if (_set_compbdev_name(comp_bdev)) {
1296 comp_bdev->comp_bdev.product_name = COMP_BDEV_NAME;
1297 comp_bdev->comp_bdev.write_cache = comp_bdev->base_bdev->write_cache;
1299 comp_bdev->comp_bdev.optimal_io_boundary =
1300 comp_bdev->params.chunk_size / comp_bdev->params.logical_block_size;
1302 comp_bdev->comp_bdev.split_on_optimal_io_boundary = true;
1304 comp_bdev->comp_bdev.blocklen = comp_bdev->params.logical_block_size;
1305 comp_bdev->comp_bdev.blockcnt = comp_bdev->params.vol_size / comp_bdev->comp_bdev.blocklen;
1306 assert(comp_bdev->comp_bdev.blockcnt > 0);
1309 * layer calls in so we'll save our comp_bdev node here.
1311 comp_bdev->comp_bdev.ctxt = comp_bdev;
1312 comp_bdev->comp_bdev.fn_table = &vbdev_compress_fn_table;
1313 comp_bdev->comp_bdev.module = &compress_if;
1317 rc = spdk_uuid_generate_sha1(&comp_bdev->comp_bdev.uuid, &ns_uuid,
1318 (const char *)&comp_bdev->base_bdev->uuid, sizeof(struct spdk_uuid));
1324 pthread_mutex_init(&comp_bdev->reduce_lock, NULL);
1327 comp_bdev->thread = spdk_get_thread();
1329 spdk_io_device_register(comp_bdev, comp_bdev_ch_create_cb, comp_bdev_ch_destroy_cb,
1331 comp_bdev->comp_bdev.name);
1333 rc = spdk_bdev_module_claim_bdev(comp_bdev->base_bdev, comp_bdev->base_desc,
1334 comp_bdev->comp_bdev.module);
1336 SPDK_ERRLOG("could not claim bdev %s, error %s\n", spdk_bdev_get_name(comp_bdev->base_bdev),
1341 rc = spdk_bdev_register(&comp_bdev->comp_bdev);
1347 TAILQ_INSERT_TAIL(&g_vbdev_comp, comp_bdev, link);
1349 SPDK_NOTICELOG("registered io_device and virtual bdev for: %s\n", comp_bdev->comp_bdev.name);
1355 spdk_bdev_module_release_bdev(comp_bdev->base_bdev);
1357 spdk_io_device_unregister(comp_bdev, NULL);
1358 free(comp_bdev->comp_bdev.name);
1389 struct vbdev_compress *comp_bdev = NULL;
1392 TAILQ_FOREACH(comp_bdev, &g_vbdev_comp, link) {
1393 if (strcmp(name, comp_bdev->comp_bdev.name) == 0) {
1398 if (comp_bdev == NULL) {
1415 comp_bdev->delete_ctx = ctx;
1418 if (comp_bdev->orphaned == false) {
1419 spdk_reduce_vol_unload(comp_bdev->vol, delete_vol_unload_cb, comp_bdev);
1421 delete_vol_unload_cb(comp_bdev, 0);
1433 struct vbdev_compress *comp_bdev = ctx;
1436 assert(comp_bdev->base_desc != NULL);
1439 spdk_put_io_channel(comp_bdev->base_ch);
1441 if (comp_bdev->reduce_errno == 0) {
1442 rc = vbdev_compress_claim(comp_bdev);
1444 spdk_reduce_vol_unload(comp_bdev->vol, _vbdev_reduce_load_unload_cb, NULL);
1447 } else if (comp_bdev->reduce_errno == -ENOENT) {
1448 if (_set_compbdev_name(comp_bdev)) {
1453 comp_bdev->thread = spdk_get_thread();
1455 comp_bdev->comp_bdev.module = &compress_if;
1456 pthread_mutex_init(&comp_bdev->reduce_lock, NULL);
1457 rc = spdk_bdev_module_claim_bdev(comp_bdev->base_bdev, comp_bdev->base_desc,
1458 comp_bdev->comp_bdev.module);
1460 SPDK_ERRLOG("could not claim bdev %s, error %s\n", spdk_bdev_get_name(comp_bdev->base_bdev),
1462 free(comp_bdev->comp_bdev.name);
1466 comp_bdev->orphaned = true;
1467 TAILQ_INSERT_TAIL(&g_vbdev_comp, comp_bdev, link);
1469 if (comp_bdev->reduce_errno != -EILSEQ) {
1470 SPDK_ERRLOG("for vol %s, error %s\n", spdk_bdev_get_name(comp_bdev->base_bdev),
1471 spdk_strerror(-comp_bdev->reduce_errno));
1481 spdk_bdev_close(comp_bdev->base_desc);
1482 free(comp_bdev);
1493 struct vbdev_compress *comp_bdev = cb_arg;
1497 comp_bdev->vol = vol;
1498 memcpy(&comp_bdev->params, spdk_reduce_vol_get_params(vol),
1500 comp_bdev->comp_algo = comp_bdev->params.comp_algo;
1501 comp_bdev->comp_level = comp_bdev->params.comp_level;
1504 comp_bdev->reduce_errno = reduce_errno;
1506 if (comp_bdev->thread && comp_bdev->thread != spdk_get_thread()) {
1507 spdk_thread_send_msg(comp_bdev->thread, _vbdev_reduce_load_cb, comp_bdev);
1509 _vbdev_reduce_load_cb(comp_bdev);
1521 struct vbdev_compress *comp_bdev;
1538 comp_bdev = _prepare_for_load_init(bdev_desc, 0, SPDK_ACCEL_COMP_ALGO_DEFLATE, 1);
1539 if (comp_bdev == NULL) {
1546 comp_bdev->thread = spdk_get_thread();
1548 comp_bdev->base_ch = spdk_bdev_get_io_channel(comp_bdev->base_desc);
1549 spdk_reduce_vol_load(&comp_bdev->backing_dev, vbdev_reduce_load_cb, comp_bdev);