diff --git a/include/spdk/bdev_module.h b/include/spdk/bdev_module.h index 8db60a87c..656fa4a7a 100644 --- a/include/spdk/bdev_module.h +++ b/include/spdk/bdev_module.h @@ -219,12 +219,6 @@ struct spdk_bdev { /** Number of blocks */ uint64_t blockcnt; - /** Quality of service parameters */ - struct spdk_bdev_qos *qos; - - /** True if the state of the QoS is being modified */ - bool qos_mod_in_progress; - /** write cache enabled, not used at the moment */ int write_cache; @@ -254,40 +248,50 @@ struct spdk_bdev { /** function table for all LUN ops */ const struct spdk_bdev_fn_table *fn_table; - /** Mutex protecting claimed */ - pthread_mutex_t mutex; - - /** The bdev status */ - enum spdk_bdev_status status; - - /** The array of block devices that this block device is built on top of (if any). */ - struct spdk_bdev **base_bdevs; - size_t base_bdevs_cnt; - - /** The array of virtual block devices built on top of this block device. */ struct spdk_bdev **vbdevs; size_t vbdevs_cnt; - /** - * Pointer to the module that has claimed this bdev for purposes of creating virtual - * bdevs on top of it. Set to NULL if the bdev has not been claimed. + /** Fields that are used internally by the bdev subsystem. Bdev modules + * must not read or write to these fields. */ - struct spdk_bdev_module *claim_module; + struct __bdev_internal_fields { + /** Quality of service parameters */ + struct spdk_bdev_qos *qos; - /** Callback function that will be called after bdev destruct is completed. */ - spdk_bdev_unregister_cb unregister_cb; + /** True if the state of the QoS is being modified */ + bool qos_mod_in_progress; - /** Unregister call context */ - void *unregister_ctx; + /** Mutex protecting claimed */ + pthread_mutex_t mutex; - /** List of open descriptors for this block device. */ - TAILQ_HEAD(, spdk_bdev_desc) open_descs; + /** The bdev status */ + enum spdk_bdev_status status; - TAILQ_ENTRY(spdk_bdev) link; + /** The array of block devices that this block device is built on top of (if any). */ + struct spdk_bdev **base_bdevs; + size_t base_bdevs_cnt; - /** points to a reset bdev_io if one is in progress. */ - struct spdk_bdev_io *reset_in_progress; + /** + * Pointer to the module that has claimed this bdev for purposes of creating virtual + * bdevs on top of it. Set to NULL if the bdev has not been claimed. + */ + struct spdk_bdev_module *claim_module; + + /** Callback function that will be called after bdev destruct is completed. */ + spdk_bdev_unregister_cb unregister_cb; + + /** Unregister call context */ + void *unregister_ctx; + + /** List of open descriptors for this block device. */ + TAILQ_HEAD(, spdk_bdev_desc) open_descs; + + TAILQ_ENTRY(spdk_bdev) link; + + /** points to a reset bdev_io if one is in progress. */ + struct spdk_bdev_io *reset_in_progress; + } internal; }; typedef void (*spdk_bdev_io_get_buf_cb)(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io); @@ -350,7 +354,8 @@ struct spdk_bdev_io { /** It may be used by modules to put the bdev_io into its own list. */ TAILQ_ENTRY(spdk_bdev_io) module_link; - /** Fields that are used internally by the bdev subsystem. Bdev modules + /** + * Fields that are used internally by the bdev subsystem. Bdev modules * must not read or write to these fields. */ struct __bdev_io_internal_fields { diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index e3cdc3349..0ef972077 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -304,7 +304,7 @@ spdk_bdev_next(struct spdk_bdev *prev) { struct spdk_bdev *bdev; - bdev = TAILQ_NEXT(prev, link); + bdev = TAILQ_NEXT(prev, internal.link); if (bdev) { SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Continuing bdev iteration at %s\n", bdev->name); } @@ -316,10 +316,10 @@ static struct spdk_bdev * _bdev_next_leaf(struct spdk_bdev *bdev) { while (bdev != NULL) { - if (bdev->claim_module == NULL) { + if (bdev->internal.claim_module == NULL) { return bdev; } else { - bdev = TAILQ_NEXT(bdev, link); + bdev = TAILQ_NEXT(bdev, internal.link); } } @@ -345,7 +345,7 @@ spdk_bdev_next_leaf(struct spdk_bdev *prev) { struct spdk_bdev *bdev; - bdev = _bdev_next_leaf(TAILQ_NEXT(prev, link)); + bdev = _bdev_next_leaf(TAILQ_NEXT(prev, internal.link)); if (bdev) { SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Continuing bdev iteration at %s\n", bdev->name); @@ -512,7 +512,7 @@ spdk_bdev_subsystem_config_json(struct spdk_json_write_ctx *w) } } - TAILQ_FOREACH(bdev, &g_bdev_mgr.bdevs, link) { + TAILQ_FOREACH(bdev, &g_bdev_mgr.bdevs, internal.link) { spdk_bdev_config_json(bdev, w); } @@ -874,7 +874,7 @@ _spdk_bdev_finish_unregister_bdevs_iter(void *cb_arg, int bdeverrno) * bdev; try to continue by manually removing this bdev from the list and continue * with the next bdev in the list. */ - TAILQ_REMOVE(&g_bdev_mgr.bdevs, bdev, link); + TAILQ_REMOVE(&g_bdev_mgr.bdevs, bdev, internal.link); } if (TAILQ_EMPTY(&g_bdev_mgr.bdevs)) { @@ -993,7 +993,7 @@ _spdk_bdev_qos_io_submit(struct spdk_bdev_channel *ch) { struct spdk_bdev_io *bdev_io = NULL; struct spdk_bdev *bdev = ch->bdev; - struct spdk_bdev_qos *qos = bdev->qos; + struct spdk_bdev_qos *qos = bdev->internal.qos; struct spdk_bdev_shared_resource *shared_resource = ch->shared_resource; while (!TAILQ_EMPTY(&qos->queued)) { @@ -1043,7 +1043,7 @@ _spdk_bdev_io_submit(void *ctx) } else if (bdev_ch->flags & BDEV_CH_QOS_ENABLED) { bdev_ch->io_outstanding--; shared_resource->io_outstanding--; - TAILQ_INSERT_TAIL(&bdev->qos->queued, bdev_io, internal.link); + TAILQ_INSERT_TAIL(&bdev->internal.qos->queued, bdev_io, internal.link); _spdk_bdev_qos_io_submit(bdev_ch); } else { SPDK_ERRLOG("unknown bdev_ch flag %x found\n", bdev_ch->flags); @@ -1061,12 +1061,12 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io) assert(bdev_io->internal.status == SPDK_BDEV_IO_STATUS_PENDING); if (bdev_io->internal.ch->flags & BDEV_CH_QOS_ENABLED) { - if (thread == bdev->qos->thread) { + if (thread == bdev->internal.qos->thread) { _spdk_bdev_io_submit(bdev_io); } else { bdev_io->internal.io_submit_ch = bdev_io->internal.ch; - bdev_io->internal.ch = bdev->qos->ch; - spdk_thread_send_msg(bdev->qos->thread, _spdk_bdev_io_submit, bdev_io); + bdev_io->internal.ch = bdev->internal.qos->ch; + spdk_thread_send_msg(bdev->internal.qos->thread, _spdk_bdev_io_submit, bdev_io); } } else { _spdk_bdev_io_submit(bdev_io); @@ -1195,11 +1195,11 @@ _spdk_bdev_channel_destroy_resource(struct spdk_bdev_channel *ch) } } -/* Caller must hold bdev->mutex. */ +/* Caller must hold bdev->internal.mutex. */ static int _spdk_bdev_enable_qos(struct spdk_bdev *bdev, struct spdk_bdev_channel *ch) { - struct spdk_bdev_qos *qos = bdev->qos; + struct spdk_bdev_qos *qos = bdev->internal.qos; /* Rate limiting on this bdev enabled */ if (qos) { @@ -1302,15 +1302,15 @@ spdk_bdev_channel_create(void *io_device, void *ctx_buf) } #endif - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); if (_spdk_bdev_enable_qos(bdev, ch)) { _spdk_bdev_channel_destroy_resource(ch); - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return -1; } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return 0; } @@ -1395,7 +1395,7 @@ spdk_bdev_qos_destroy(struct spdk_bdev *bdev) */ struct spdk_bdev_qos *new_qos, *old_qos; - old_qos = bdev->qos; + old_qos = bdev->internal.qos; new_qos = calloc(1, sizeof(*new_qos)); if (!new_qos) { @@ -1416,7 +1416,7 @@ spdk_bdev_qos_destroy(struct spdk_bdev *bdev) new_qos->poller = NULL; TAILQ_INIT(&new_qos->queued); - bdev->qos = new_qos; + bdev->internal.qos = new_qos; spdk_thread_send_msg(old_qos->thread, spdk_bdev_qos_channel_destroy, old_qos); @@ -1541,11 +1541,11 @@ spdk_bdev_get_qos_ios_per_sec(struct spdk_bdev *bdev) { uint64_t iops_rate_limit = 0; - pthread_mutex_lock(&bdev->mutex); - if (bdev->qos) { - iops_rate_limit = bdev->qos->iops_rate_limit; + pthread_mutex_lock(&bdev->internal.mutex); + if (bdev->internal.qos) { + iops_rate_limit = bdev->internal.qos->iops_rate_limit; } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return iops_rate_limit; } @@ -1584,10 +1584,10 @@ spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size) { int ret; - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); /* bdev has open descriptors */ - if (!TAILQ_EMPTY(&bdev->open_descs) && + if (!TAILQ_EMPTY(&bdev->internal.open_descs) && bdev->blockcnt > size) { ret = -EBUSY; } else { @@ -1595,7 +1595,7 @@ spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size) ret = 0; } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return ret; } @@ -2040,11 +2040,11 @@ _spdk_bdev_reset_freeze_channel(struct spdk_io_channel_iter *i) * the channel flag is set, so the lock here should not * be necessary. We're not in the fast path though, so * just take it anyway. */ - pthread_mutex_lock(&channel->bdev->mutex); - if (channel->bdev->qos->ch == channel) { - TAILQ_SWAP(&channel->bdev->qos->queued, &tmp_queued, spdk_bdev_io, internal.link); + pthread_mutex_lock(&channel->bdev->internal.mutex); + if (channel->bdev->internal.qos->ch == channel) { + TAILQ_SWAP(&channel->bdev->internal.qos->queued, &tmp_queued, spdk_bdev_io, internal.link); } - pthread_mutex_unlock(&channel->bdev->mutex); + pthread_mutex_unlock(&channel->bdev->internal.mutex); } _spdk_bdev_abort_queued_io(&shared_resource->nomem_io, channel); @@ -2071,9 +2071,9 @@ _spdk_bdev_channel_start_reset(struct spdk_bdev_channel *ch) assert(!TAILQ_EMPTY(&ch->queued_resets)); - pthread_mutex_lock(&bdev->mutex); - if (bdev->reset_in_progress == NULL) { - bdev->reset_in_progress = TAILQ_FIRST(&ch->queued_resets); + pthread_mutex_lock(&bdev->internal.mutex); + if (bdev->internal.reset_in_progress == NULL) { + bdev->internal.reset_in_progress = TAILQ_FIRST(&ch->queued_resets); /* * Take a channel reference for the target bdev for the life of this * reset. This guards against the channel getting destroyed while @@ -2081,10 +2081,10 @@ _spdk_bdev_channel_start_reset(struct spdk_bdev_channel *ch) * progress. We will release the reference when this reset is * completed. */ - bdev->reset_in_progress->u.reset.ch_ref = spdk_get_io_channel(__bdev_to_io_dev(bdev)); + bdev->internal.reset_in_progress->u.reset.ch_ref = spdk_get_io_channel(__bdev_to_io_dev(bdev)); _spdk_bdev_start_reset(ch); } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); } int @@ -2105,9 +2105,9 @@ spdk_bdev_reset(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch, bdev_io->u.reset.ch_ref = NULL; spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb); - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); TAILQ_INSERT_TAIL(&channel->queued_resets, bdev_io, internal.link); - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); _spdk_bdev_channel_start_reset(channel); @@ -2445,12 +2445,12 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta if (status == SPDK_BDEV_IO_STATUS_NOMEM) { SPDK_ERRLOG("NOMEM returned for reset\n"); } - pthread_mutex_lock(&bdev->mutex); - if (bdev_io == bdev->reset_in_progress) { - bdev->reset_in_progress = NULL; + pthread_mutex_lock(&bdev->internal.mutex); + if (bdev_io == bdev->internal.reset_in_progress) { + bdev->internal.reset_in_progress = NULL; unlock_channels = true; } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); if (unlock_channels) { spdk_for_each_channel(__bdev_to_io_dev(bdev), _spdk_bdev_unfreeze_channel, @@ -2598,9 +2598,9 @@ _spdk_bdev_qos_config_type(struct spdk_bdev *bdev, uint64_t qos_set, return; } - if (!bdev->qos) { - bdev->qos = calloc(1, sizeof(*bdev->qos)); - if (!bdev->qos) { + if (!bdev->internal.qos) { + bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); + if (!bdev->internal.qos) { SPDK_ERRLOG("Unable to allocate memory for QoS tracking\n"); return; } @@ -2608,10 +2608,10 @@ _spdk_bdev_qos_config_type(struct spdk_bdev *bdev, uint64_t qos_set, switch (qos_type) { case SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT: - bdev->qos->iops_rate_limit = qos_set; + bdev->internal.qos->iops_rate_limit = qos_set; break; case SPDK_BDEV_QOS_RW_BYTEPS_RATE_LIMIT: - bdev->qos->byte_rate_limit = qos_set * 1024 * 1024; + bdev->internal.qos->byte_rate_limit = qos_set * 1024 * 1024; break; default: break; @@ -2679,13 +2679,13 @@ spdk_bdev_init(struct spdk_bdev *bdev) return -EEXIST; } - bdev->status = SPDK_BDEV_STATUS_READY; + bdev->internal.status = SPDK_BDEV_STATUS_READY; - TAILQ_INIT(&bdev->open_descs); + TAILQ_INIT(&bdev->internal.open_descs); TAILQ_INIT(&bdev->aliases); - bdev->reset_in_progress = NULL; + bdev->internal.reset_in_progress = NULL; _spdk_bdev_qos_config(bdev); @@ -2693,7 +2693,7 @@ spdk_bdev_init(struct spdk_bdev *bdev) spdk_bdev_channel_create, spdk_bdev_channel_destroy, sizeof(struct spdk_bdev_channel)); - pthread_mutex_init(&bdev->mutex, NULL); + pthread_mutex_init(&bdev->internal.mutex, NULL); return 0; } @@ -2706,8 +2706,8 @@ spdk_bdev_destroy_cb(void *io_device) void *cb_arg; bdev = __bdev_from_io_dev(io_device); - cb_fn = bdev->unregister_cb; - cb_arg = bdev->unregister_ctx; + cb_fn = bdev->internal.unregister_cb; + cb_arg = bdev->internal.unregister_ctx; rc = bdev->fn_table->destruct(bdev->ctxt); if (rc < 0) { @@ -2722,9 +2722,9 @@ spdk_bdev_destroy_cb(void *io_device) static void spdk_bdev_fini(struct spdk_bdev *bdev) { - pthread_mutex_destroy(&bdev->mutex); + pthread_mutex_destroy(&bdev->internal.mutex); - free(bdev->qos); + free(bdev->internal.qos); spdk_io_device_unregister(__bdev_to_io_dev(bdev), spdk_bdev_destroy_cb); } @@ -2735,7 +2735,7 @@ spdk_bdev_start(struct spdk_bdev *bdev) struct spdk_bdev_module *module; SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Inserting bdev %s into list\n", bdev->name); - TAILQ_INSERT_TAIL(&g_bdev_mgr.bdevs, bdev, link); + TAILQ_INSERT_TAIL(&g_bdev_mgr.bdevs, bdev, internal.link); TAILQ_FOREACH(module, &g_bdev_mgr.bdev_modules, tailq) { if (module->examine) { @@ -2766,9 +2766,9 @@ spdk_vbdev_remove_base_bdevs(struct spdk_bdev *vbdev) bool found; /* Iterate over base bdevs to remove vbdev from them. */ - for (i = 0; i < vbdev->base_bdevs_cnt; i++) { + for (i = 0; i < vbdev->internal.base_bdevs_cnt; i++) { found = false; - base = vbdev->base_bdevs[i]; + base = vbdev->internal.base_bdevs[i]; for (j = 0; j < base->vbdevs_cnt; j++) { if (base->vbdevs[j] != vbdev) { @@ -2799,9 +2799,9 @@ spdk_vbdev_remove_base_bdevs(struct spdk_bdev *vbdev) } } - free(vbdev->base_bdevs); - vbdev->base_bdevs = NULL; - vbdev->base_bdevs_cnt = 0; + free(vbdev->internal.base_bdevs); + vbdev->internal.base_bdevs = NULL; + vbdev->internal.base_bdevs_cnt = 0; } static int @@ -2812,23 +2812,23 @@ spdk_vbdev_set_base_bdevs(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs size_t i; /* Adding base bdevs isn't supported (yet?). */ - assert(vbdev->base_bdevs_cnt == 0); + assert(vbdev->internal.base_bdevs_cnt == 0); - vbdev->base_bdevs = malloc(cnt * sizeof(vbdev->base_bdevs[0])); - if (!vbdev->base_bdevs) { + vbdev->internal.base_bdevs = malloc(cnt * sizeof(vbdev->internal.base_bdevs[0])); + if (!vbdev->internal.base_bdevs) { SPDK_ERRLOG("%s - realloc() failed\n", vbdev->name); return -ENOMEM; } - memcpy(vbdev->base_bdevs, base_bdevs, cnt * sizeof(vbdev->base_bdevs[0])); - vbdev->base_bdevs_cnt = cnt; + memcpy(vbdev->internal.base_bdevs, base_bdevs, cnt * sizeof(vbdev->internal.base_bdevs[0])); + vbdev->internal.base_bdevs_cnt = cnt; /* Iterate over base bdevs to add this vbdev to them. */ for (i = 0; i < cnt; i++) { - base = vbdev->base_bdevs[i]; + base = vbdev->internal.base_bdevs[i]; assert(base != NULL); - assert(base->claim_module != NULL); + assert(base->internal.claim_module != NULL); vbdevs = realloc(base->vbdevs, (base->vbdevs_cnt + 1) * sizeof(vbdevs[0])); if (!vbdevs) { @@ -2874,8 +2874,8 @@ spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int void spdk_bdev_destruct_done(struct spdk_bdev *bdev, int bdeverrno) { - if (bdev->unregister_cb != NULL) { - bdev->unregister_cb(bdev->unregister_ctx, bdeverrno); + if (bdev->internal.unregister_cb != NULL) { + bdev->internal.unregister_cb(bdev->internal.unregister_ctx, bdeverrno); } } @@ -2903,15 +2903,15 @@ spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void return; } - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); spdk_vbdev_remove_base_bdevs(bdev); - bdev->status = SPDK_BDEV_STATUS_REMOVING; - bdev->unregister_cb = cb_fn; - bdev->unregister_ctx = cb_arg; + bdev->internal.status = SPDK_BDEV_STATUS_REMOVING; + bdev->internal.unregister_cb = cb_fn; + bdev->internal.unregister_ctx = cb_arg; - TAILQ_FOREACH_SAFE(desc, &bdev->open_descs, link, tmp) { + TAILQ_FOREACH_SAFE(desc, &bdev->internal.open_descs, link, tmp) { if (desc->remove_cb) { do_destruct = false; /* @@ -2929,12 +2929,12 @@ spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void } if (!do_destruct) { - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return; } - TAILQ_REMOVE(&g_bdev_mgr.bdevs, bdev, link); - pthread_mutex_unlock(&bdev->mutex); + TAILQ_REMOVE(&g_bdev_mgr.bdevs, bdev, internal.link); + pthread_mutex_unlock(&bdev->internal.mutex); spdk_bdev_fini(bdev); } @@ -2954,16 +2954,16 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_ SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Opening descriptor %p for bdev %s on thread %p\n", desc, bdev->name, spdk_get_thread()); - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); - if (write && bdev->claim_module) { + if (write && bdev->internal.claim_module) { SPDK_ERRLOG("Could not open %s - already claimed\n", bdev->name); free(desc); - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return -EPERM; } - TAILQ_INSERT_TAIL(&bdev->open_descs, desc, link); + TAILQ_INSERT_TAIL(&bdev->internal.open_descs, desc, link); desc->bdev = bdev; desc->remove_cb = remove_cb; @@ -2971,7 +2971,7 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_ desc->write = write; *_desc = desc; - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); return 0; } @@ -2985,13 +2985,13 @@ spdk_bdev_close(struct spdk_bdev_desc *desc) SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Closing descriptor %p for bdev %s on thread %p\n", desc, bdev->name, spdk_get_thread()); - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); - TAILQ_REMOVE(&bdev->open_descs, desc, link); + TAILQ_REMOVE(&bdev->internal.open_descs, desc, link); free(desc); /* If no more descriptors, kill QoS channel */ - if (bdev->qos && TAILQ_EMPTY(&bdev->open_descs)) { + if (bdev->internal.qos && TAILQ_EMPTY(&bdev->internal.open_descs)) { SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Closed last descriptor for bdev %s on thread %p. Stopping QoS.\n", bdev->name, spdk_get_thread()); @@ -3003,13 +3003,13 @@ spdk_bdev_close(struct spdk_bdev_desc *desc) } } - if (bdev->status == SPDK_BDEV_STATUS_REMOVING && TAILQ_EMPTY(&bdev->open_descs)) { + if (bdev->internal.status == SPDK_BDEV_STATUS_REMOVING && TAILQ_EMPTY(&bdev->internal.open_descs)) { do_unregister = true; } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); if (do_unregister == true) { - spdk_bdev_unregister(bdev, bdev->unregister_cb, bdev->unregister_ctx); + spdk_bdev_unregister(bdev, bdev->internal.unregister_cb, bdev->internal.unregister_ctx); } } @@ -3017,9 +3017,9 @@ int spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_bdev_module *module) { - if (bdev->claim_module != NULL) { + if (bdev->internal.claim_module != NULL) { SPDK_ERRLOG("bdev %s already claimed by module %s\n", bdev->name, - bdev->claim_module->name); + bdev->internal.claim_module->name); return -EPERM; } @@ -3027,15 +3027,15 @@ spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, desc->write = true; } - bdev->claim_module = module; + bdev->internal.claim_module = module; return 0; } void spdk_bdev_module_release_bdev(struct spdk_bdev *bdev) { - assert(bdev->claim_module != NULL); - bdev->claim_module = NULL; + assert(bdev->internal.claim_module != NULL); + bdev->internal.claim_module = NULL; } struct spdk_bdev * @@ -3155,9 +3155,9 @@ struct set_qos_limit_ctx { static void _spdk_bdev_set_qos_limit_done(struct set_qos_limit_ctx *ctx, int status) { - pthread_mutex_lock(&ctx->bdev->mutex); - ctx->bdev->qos_mod_in_progress = false; - pthread_mutex_unlock(&ctx->bdev->mutex); + pthread_mutex_lock(&ctx->bdev->internal.mutex); + ctx->bdev->internal.qos_mod_in_progress = false; + pthread_mutex_unlock(&ctx->bdev->internal.mutex); ctx->cb_fn(ctx->cb_arg, status); free(ctx); @@ -3170,10 +3170,10 @@ _spdk_bdev_disable_qos_done(void *cb_arg) struct spdk_bdev *bdev = ctx->bdev; struct spdk_bdev_qos *qos; - pthread_mutex_lock(&bdev->mutex); - qos = bdev->qos; - bdev->qos = NULL; - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); + qos = bdev->internal.qos; + bdev->internal.qos = NULL; + pthread_mutex_unlock(&bdev->internal.mutex); _spdk_bdev_abort_queued_io(&qos->queued, qos->ch); spdk_put_io_channel(spdk_io_channel_from_ctx(qos->ch)); @@ -3192,9 +3192,9 @@ _spdk_bdev_disable_qos_msg_done(struct spdk_io_channel_iter *i, int status) struct set_qos_limit_ctx *ctx = spdk_io_channel_iter_get_ctx(i); struct spdk_thread *thread; - pthread_mutex_lock(&bdev->mutex); - thread = bdev->qos->thread; - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); + thread = bdev->internal.qos->thread; + pthread_mutex_unlock(&bdev->internal.mutex); spdk_thread_send_msg(thread, _spdk_bdev_disable_qos_done, ctx); } @@ -3216,9 +3216,9 @@ _spdk_bdev_update_qos_limit_iops_msg(void *cb_arg) struct set_qos_limit_ctx *ctx = cb_arg; struct spdk_bdev *bdev = ctx->bdev; - pthread_mutex_lock(&bdev->mutex); - spdk_bdev_qos_update_max_quota_per_timeslice(bdev->qos); - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); + spdk_bdev_qos_update_max_quota_per_timeslice(bdev->internal.qos); + pthread_mutex_unlock(&bdev->internal.mutex); _spdk_bdev_set_qos_limit_done(ctx, 0); } @@ -3232,9 +3232,9 @@ _spdk_bdev_enable_qos_msg(struct spdk_io_channel_iter *i) struct spdk_bdev_channel *bdev_ch = spdk_io_channel_get_ctx(ch); int rc; - pthread_mutex_lock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); rc = _spdk_bdev_enable_qos(bdev, bdev_ch); - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); spdk_for_each_channel_continue(i, rc); } @@ -3269,50 +3269,50 @@ spdk_bdev_set_qos_limit_iops(struct spdk_bdev *bdev, uint64_t ios_per_sec, ctx->cb_arg = cb_arg; ctx->bdev = bdev; - pthread_mutex_lock(&bdev->mutex); - if (bdev->qos_mod_in_progress) { - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_lock(&bdev->internal.mutex); + if (bdev->internal.qos_mod_in_progress) { + pthread_mutex_unlock(&bdev->internal.mutex); free(ctx); cb_fn(cb_arg, -EAGAIN); return; } - bdev->qos_mod_in_progress = true; + bdev->internal.qos_mod_in_progress = true; if (ios_per_sec > 0) { - if (bdev->qos == NULL) { + if (bdev->internal.qos == NULL) { /* Enabling */ - bdev->qos = calloc(1, sizeof(*bdev->qos)); - if (!bdev->qos) { - pthread_mutex_unlock(&bdev->mutex); + bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); + if (!bdev->internal.qos) { + pthread_mutex_unlock(&bdev->internal.mutex); SPDK_ERRLOG("Unable to allocate memory for QoS tracking\n"); free(ctx); cb_fn(cb_arg, -ENOMEM); return; } - bdev->qos->iops_rate_limit = ios_per_sec; + bdev->internal.qos->iops_rate_limit = ios_per_sec; spdk_for_each_channel(__bdev_to_io_dev(bdev), _spdk_bdev_enable_qos_msg, ctx, _spdk_bdev_enable_qos_done); } else { /* Updating */ - bdev->qos->iops_rate_limit = ios_per_sec; - spdk_thread_send_msg(bdev->qos->thread, _spdk_bdev_update_qos_limit_iops_msg, ctx); + bdev->internal.qos->iops_rate_limit = ios_per_sec; + spdk_thread_send_msg(bdev->internal.qos->thread, _spdk_bdev_update_qos_limit_iops_msg, ctx); } } else { - if (bdev->qos != NULL) { + if (bdev->internal.qos != NULL) { /* Disabling */ spdk_for_each_channel(__bdev_to_io_dev(bdev), _spdk_bdev_disable_qos_msg, ctx, _spdk_bdev_disable_qos_msg_done); } else { - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); _spdk_bdev_set_qos_limit_done(ctx, 0); return; } } - pthread_mutex_unlock(&bdev->mutex); + pthread_mutex_unlock(&bdev->internal.mutex); } SPDK_LOG_REGISTER_COMPONENT("bdev", SPDK_LOG_BDEV) diff --git a/lib/bdev/rpc/bdev_rpc.c b/lib/bdev/rpc/bdev_rpc.c index 841927154..5fb760146 100644 --- a/lib/bdev/rpc/bdev_rpc.c +++ b/lib/bdev/rpc/bdev_rpc.c @@ -228,7 +228,7 @@ spdk_rpc_dump_bdev_info(struct spdk_json_write_ctx *w, spdk_json_write_uint64(w, spdk_bdev_get_qos_ios_per_sec(bdev)); spdk_json_write_name(w, "claimed"); - spdk_json_write_bool(w, (bdev->claim_module != NULL)); + spdk_json_write_bool(w, (bdev->internal.claim_module != NULL)); spdk_json_write_name(w, "supported_io_types"); spdk_json_write_object_begin(w); diff --git a/test/unit/lib/bdev/bdev.c/bdev_ut.c b/test/unit/lib/bdev/bdev.c/bdev_ut.c index 9f3075521..2316cd9a3 100644 --- a/test/unit/lib/bdev/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/bdev.c/bdev_ut.c @@ -215,8 +215,8 @@ is_base_bdev(struct spdk_bdev *base, struct spdk_bdev *vbdev) size_t i; int found = 0; - for (i = 0; i < vbdev->base_bdevs_cnt; i++) { - found += vbdev->base_bdevs[i] == base; + for (i = 0; i < vbdev->internal.base_bdevs_cnt; i++) { + found += vbdev->internal.base_bdevs[i] == base; } CU_ASSERT(found <= 1); @@ -250,7 +250,7 @@ allocate_bdev(char *name) rc = spdk_bdev_register(bdev); CU_ASSERT(rc == 0); - CU_ASSERT(bdev->base_bdevs_cnt == 0); + CU_ASSERT(bdev->internal.base_bdevs_cnt == 0); CU_ASSERT(bdev->vbdevs_cnt == 0); return bdev; @@ -278,7 +278,7 @@ allocate_vbdev(char *name, struct spdk_bdev *base1, struct spdk_bdev *base2) rc = spdk_vbdev_register(bdev, array, base2 == NULL ? 1 : 2); CU_ASSERT(rc == 0); - CU_ASSERT(bdev->base_bdevs_cnt > 0); + CU_ASSERT(bdev->internal.base_bdevs_cnt > 0); CU_ASSERT(bdev->vbdevs_cnt == 0); CU_ASSERT(check_base_and_vbdev(base1, bdev) == true); @@ -301,7 +301,7 @@ free_bdev(struct spdk_bdev *bdev) static void free_vbdev(struct spdk_bdev *bdev) { - CU_ASSERT(bdev->base_bdevs_cnt != 0); + CU_ASSERT(bdev->internal.base_bdevs_cnt != 0); spdk_bdev_unregister(bdev, NULL, NULL); memset(bdev, 0xFF, sizeof(*bdev)); free(bdev); diff --git a/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c b/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c index b80262d1e..08e5f240b 100644 --- a/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c @@ -450,7 +450,7 @@ aborted_reset(void) CU_ASSERT(io_ch[0] != NULL); spdk_bdev_reset(g_desc, io_ch[0], aborted_reset_done, &status1); poll_threads(); - CU_ASSERT(g_bdev.bdev.reset_in_progress != NULL); + CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); /* * First reset has been submitted on ch0. Now submit a second @@ -462,32 +462,32 @@ aborted_reset(void) CU_ASSERT(io_ch[1] != NULL); spdk_bdev_reset(g_desc, io_ch[1], aborted_reset_done, &status2); poll_threads(); - CU_ASSERT(g_bdev.bdev.reset_in_progress != NULL); + CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); /* * Now destroy ch1. This will abort the queued reset. Check that * the second reset was completed with failed status. Also check - * that bdev->reset_in_progress != NULL, since the original reset - * has not been completed yet. This ensures that the bdev code is - * correctly noticing that the failed reset is *not* the one that - * had been submitted to the bdev module. + * that bdev->internal.reset_in_progress != NULL, since the + * original reset has not been completed yet. This ensures that + * the bdev code is correctly noticing that the failed reset is + * *not* the one that had been submitted to the bdev module. */ set_thread(1); spdk_put_io_channel(io_ch[1]); poll_threads(); CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_FAILED); - CU_ASSERT(g_bdev.bdev.reset_in_progress != NULL); + CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); /* * Now complete the first reset, verify that it completed with SUCCESS - * status and that bdev->reset_in_progress is also set back to NULL. + * status and that bdev->internal.reset_in_progress is also set back to NULL. */ set_thread(0); spdk_put_io_channel(io_ch[0]); stub_complete_io(g_bdev.io_target, 0); poll_threads(); CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); - CU_ASSERT(g_bdev.bdev.reset_in_progress == NULL); + CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); teardown_test(); } @@ -618,15 +618,15 @@ basic_qos(void) /* Enable QoS */ bdev = &g_bdev.bdev; - bdev->qos = calloc(1, sizeof(*bdev->qos)); - SPDK_CU_ASSERT_FATAL(bdev->qos != NULL); - TAILQ_INIT(&bdev->qos->queued); + bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); + SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); + TAILQ_INIT(&bdev->internal.qos->queued); /* * Enable both IOPS and bandwidth rate limits. * In this case, both rate limits will take equal effect. */ - bdev->qos->iops_rate_limit = 2000; /* 2 I/O per millisecond */ - bdev->qos->byte_rate_limit = 8192000; /* 8K byte per millisecond with 4K block size */ + bdev->internal.qos->iops_rate_limit = 2000; /* 2 I/O per millisecond */ + bdev->internal.qos->byte_rate_limit = 8192000; /* 8K byte per millisecond with 4K block size */ g_get_io_channel = true; @@ -682,7 +682,7 @@ basic_qos(void) /* Close the descriptor, which should stop the qos channel */ spdk_bdev_close(g_desc); poll_threads(); - CU_ASSERT(bdev->qos->ch == NULL); + CU_ASSERT(bdev->internal.qos->ch == NULL); spdk_bdev_open(bdev, true, NULL, NULL, &g_desc); @@ -698,7 +698,7 @@ basic_qos(void) CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); /* Confirm that the qos thread is now thread 1 */ - CU_ASSERT(bdev->qos->ch == bdev_ch[1]); + CU_ASSERT(bdev->internal.qos->ch == bdev_ch[1]); /* Tear down the channels */ set_thread(0); @@ -726,15 +726,15 @@ io_during_qos_queue(void) /* Enable QoS */ bdev = &g_bdev.bdev; - bdev->qos = calloc(1, sizeof(*bdev->qos)); - SPDK_CU_ASSERT_FATAL(bdev->qos != NULL); - TAILQ_INIT(&bdev->qos->queued); + bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); + SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); + TAILQ_INIT(&bdev->internal.qos->queued); /* * Enable both IOPS and bandwidth rate limits. * In this case, IOPS rate limit will take effect first. */ - bdev->qos->iops_rate_limit = 1000; /* 1000 I/O per second, or 1 per millisecond */ - bdev->qos->byte_rate_limit = 8192000; /* 8K byte per millisecond with 4K block size */ + bdev->internal.qos->iops_rate_limit = 1000; /* 1000 I/O per second, or 1 per millisecond */ + bdev->internal.qos->byte_rate_limit = 8192000; /* 8K byte per millisecond with 4K block size */ g_get_io_channel = true; @@ -814,15 +814,15 @@ io_during_qos_reset(void) /* Enable QoS */ bdev = &g_bdev.bdev; - bdev->qos = calloc(1, sizeof(*bdev->qos)); - SPDK_CU_ASSERT_FATAL(bdev->qos != NULL); - TAILQ_INIT(&bdev->qos->queued); + bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); + SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); + TAILQ_INIT(&bdev->internal.qos->queued); /* * Enable both IOPS and bandwidth rate limits. * In this case, bandwidth rate limit will take effect first. */ - bdev->qos->iops_rate_limit = 2000; /* 2000 I/O per second, or 2 per millisecond */ - bdev->qos->byte_rate_limit = 4096000; /* 4K byte per millisecond with 4K block size */ + bdev->internal.qos->iops_rate_limit = 2000; /* 2000 I/O per second, or 2 per millisecond */ + bdev->internal.qos->byte_rate_limit = 4096000; /* 4K byte per millisecond with 4K block size */ g_get_io_channel = true;