Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89ec9cfd authored by Mike Christie's avatar Mike Christie Committed by Nicholas Bellinger
Browse files

tcmu: split unmap_thread_fn



Separate unmap_thread_fn to make it easier to read.

Note: this patch does not fix the bug where we might
miss a wake up call. The next patch will fix that.
This patch only separates the code into functions.

Signed-off-by: default avatarMike Christie <mchristi@redhat.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent bf99ec13
Loading
Loading
Loading
Loading
+70 −50
Original line number Diff line number Diff line
@@ -1973,22 +1973,13 @@ static struct target_backend_ops tcmu_ops = {
	.tb_dev_attrib_attrs	= NULL,
};

static int unmap_thread_fn(void *data)

static void find_free_blocks(void)
{
	struct tcmu_dev *udev;
	loff_t off;
	uint32_t start, end, block;

	while (!kthread_should_stop()) {
		DEFINE_WAIT(__wait);

		prepare_to_wait(&unmap_wait, &__wait, TASK_INTERRUPTIBLE);
		schedule();
		finish_wait(&unmap_wait, &__wait);

		if (kthread_should_stop())
			break;

	mutex_lock(&root_udev_mutex);
	list_for_each_entry(udev, &root_udev, node) {
		mutex_lock(&udev->cmdr_lock);
@@ -2028,18 +2019,47 @@ static int unmap_thread_fn(void *data)
		tcmu_blocks_release(&udev->data_blocks, start, end);
		mutex_unlock(&udev->cmdr_lock);
	}
	mutex_unlock(&root_udev_mutex);
}

static void run_cmdr_queues(void)
{
	struct tcmu_dev *udev;

	/*
	 * Try to wake up the udevs who are waiting
		 * for the global data pool.
	 * for the global data block pool.
	 */
	mutex_lock(&root_udev_mutex);
	list_for_each_entry(udev, &root_udev, node) {
			if (udev->waiting_global)
		mutex_lock(&udev->cmdr_lock);
		if (!udev->waiting_global) {
			mutex_unlock(&udev->cmdr_lock);
			break;
		}
		mutex_unlock(&udev->cmdr_lock);

		wake_up(&udev->wait_cmdr);
	}
	mutex_unlock(&root_udev_mutex);
}

static int unmap_thread_fn(void *data)
{
	while (!kthread_should_stop()) {
		DEFINE_WAIT(__wait);

		prepare_to_wait(&unmap_wait, &__wait, TASK_INTERRUPTIBLE);
		schedule();
		finish_wait(&unmap_wait, &__wait);

		if (kthread_should_stop())
			break;

		find_free_blocks();
		run_cmdr_queues();
	}

	return 0;
}