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

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
...@@ -1973,22 +1973,13 @@ static struct target_backend_ops tcmu_ops = { ...@@ -1973,22 +1973,13 @@ static struct target_backend_ops tcmu_ops = {
.tb_dev_attrib_attrs = NULL, .tb_dev_attrib_attrs = NULL,
}; };
static int unmap_thread_fn(void *data)
static void find_free_blocks(void)
{ {
struct tcmu_dev *udev; struct tcmu_dev *udev;
loff_t off; loff_t off;
uint32_t start, end, block; 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); mutex_lock(&root_udev_mutex);
list_for_each_entry(udev, &root_udev, node) { list_for_each_entry(udev, &root_udev, node) {
mutex_lock(&udev->cmdr_lock); mutex_lock(&udev->cmdr_lock);
...@@ -2028,16 +2019,45 @@ static int unmap_thread_fn(void *data) ...@@ -2028,16 +2019,45 @@ static int unmap_thread_fn(void *data)
tcmu_blocks_release(&udev->data_blocks, start, end); tcmu_blocks_release(&udev->data_blocks, start, end);
mutex_unlock(&udev->cmdr_lock); 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 * 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) { 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); wake_up(&udev->wait_cmdr);
} }
mutex_unlock(&root_udev_mutex); 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; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment