bdev: update the function to get the QoS setting
Instead of accessing the qos_channel pointer on the bdev, always have the QoS parameter on the allocated memory of qos_channel structure. The bdev->qos_channel is set to NULL in the destroy operation, and the destroy is through the async message which could be executed later after the poller function within which the bdev->qos_channel is accessed (thus a NULL pointer dereferenced). In this case, assign the memory address of the allcoated qos_channel to the function as the parameter to solve this issue. Change-Id: I2fdb53cb0a6a29fb41ab28362f8e068d21ee5d12 Signed-off-by: GangCao <gang.cao@intel.com> Reviewed-on: https://review.gerrithub.io/405438 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
c540ca01a3
commit
3709dfd674
@ -998,25 +998,25 @@ spdk_bdev_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w)
|
||||
}
|
||||
|
||||
static void
|
||||
spdk_bdev_qos_get_max_ios_per_timeslice(struct spdk_bdev *bdev)
|
||||
spdk_bdev_qos_get_max_ios_per_timeslice(struct spdk_bdev_channel *qos_ch)
|
||||
{
|
||||
uint64_t qos_max_ios_per_timeslice = 0;
|
||||
uint64_t qos_max_ios_per_timeslice = 0;
|
||||
struct spdk_bdev *bdev = qos_ch->bdev;
|
||||
|
||||
qos_max_ios_per_timeslice = bdev->ios_per_sec * SPDK_BDEV_QOS_TIMESLICE_IN_USEC /
|
||||
SPDK_BDEV_SEC_TO_USEC;
|
||||
bdev->qos_channel->qos_max_ios_per_timeslice = spdk_max(qos_max_ios_per_timeslice,
|
||||
SPDK_BDEV_QOS_MIN_IO_PER_TIMESLICE);
|
||||
qos_ch->qos_max_ios_per_timeslice = spdk_max(qos_max_ios_per_timeslice,
|
||||
SPDK_BDEV_QOS_MIN_IO_PER_TIMESLICE);
|
||||
}
|
||||
|
||||
static int
|
||||
spdk_bdev_channel_poll_qos(void *arg)
|
||||
{
|
||||
struct spdk_bdev_channel *ch = arg;
|
||||
struct spdk_bdev *bdev = ch->bdev;
|
||||
|
||||
/* Reset for next round of rate limiting */
|
||||
ch->io_submitted_this_timeslice = 0;
|
||||
spdk_bdev_qos_get_max_ios_per_timeslice(bdev);
|
||||
spdk_bdev_qos_get_max_ios_per_timeslice(ch);
|
||||
|
||||
_spdk_bdev_qos_io_submit(ch);
|
||||
|
||||
@ -1134,7 +1134,7 @@ spdk_bdev_qos_channel_create(struct spdk_bdev *bdev)
|
||||
}
|
||||
|
||||
bdev->qos_channel->flags |= BDEV_CH_QOS_ENABLED;
|
||||
spdk_bdev_qos_get_max_ios_per_timeslice(bdev);
|
||||
spdk_bdev_qos_get_max_ios_per_timeslice(bdev->qos_channel);
|
||||
bdev->qos_channel->qos_poller = spdk_poller_register(
|
||||
spdk_bdev_channel_poll_qos,
|
||||
bdev->qos_channel,
|
||||
|
Loading…
Reference in New Issue
Block a user