mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-20 22:15:59 +00:00
dm crypt: use wake_up_process() instead of a wait queue
This is a small simplification of dm-crypt - use wake_up_process() instead of a wait queue in a case where only one process may be waiting. dm-writecache uses a similar pattern. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
a3fcf72531
commit
c7329eff72
1 changed files with 10 additions and 15 deletions
|
@ -144,7 +144,7 @@ struct crypt_config {
|
||||||
struct workqueue_struct *io_queue;
|
struct workqueue_struct *io_queue;
|
||||||
struct workqueue_struct *crypt_queue;
|
struct workqueue_struct *crypt_queue;
|
||||||
|
|
||||||
wait_queue_head_t write_thread_wait;
|
spinlock_t write_thread_lock;
|
||||||
struct task_struct *write_thread;
|
struct task_struct *write_thread;
|
||||||
struct rb_root write_tree;
|
struct rb_root write_tree;
|
||||||
|
|
||||||
|
@ -1620,36 +1620,31 @@ static int dmcrypt_write(void *data)
|
||||||
struct rb_root write_tree;
|
struct rb_root write_tree;
|
||||||
struct blk_plug plug;
|
struct blk_plug plug;
|
||||||
|
|
||||||
DECLARE_WAITQUEUE(wait, current);
|
spin_lock_irq(&cc->write_thread_lock);
|
||||||
|
|
||||||
spin_lock_irq(&cc->write_thread_wait.lock);
|
|
||||||
continue_locked:
|
continue_locked:
|
||||||
|
|
||||||
if (!RB_EMPTY_ROOT(&cc->write_tree))
|
if (!RB_EMPTY_ROOT(&cc->write_tree))
|
||||||
goto pop_from_list;
|
goto pop_from_list;
|
||||||
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
set_current_state(TASK_INTERRUPTIBLE);
|
||||||
__add_wait_queue(&cc->write_thread_wait, &wait);
|
|
||||||
|
|
||||||
spin_unlock_irq(&cc->write_thread_wait.lock);
|
spin_unlock_irq(&cc->write_thread_lock);
|
||||||
|
|
||||||
if (unlikely(kthread_should_stop())) {
|
if (unlikely(kthread_should_stop())) {
|
||||||
set_current_state(TASK_RUNNING);
|
set_current_state(TASK_RUNNING);
|
||||||
remove_wait_queue(&cc->write_thread_wait, &wait);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
schedule();
|
schedule();
|
||||||
|
|
||||||
set_current_state(TASK_RUNNING);
|
set_current_state(TASK_RUNNING);
|
||||||
spin_lock_irq(&cc->write_thread_wait.lock);
|
spin_lock_irq(&cc->write_thread_lock);
|
||||||
__remove_wait_queue(&cc->write_thread_wait, &wait);
|
|
||||||
goto continue_locked;
|
goto continue_locked;
|
||||||
|
|
||||||
pop_from_list:
|
pop_from_list:
|
||||||
write_tree = cc->write_tree;
|
write_tree = cc->write_tree;
|
||||||
cc->write_tree = RB_ROOT;
|
cc->write_tree = RB_ROOT;
|
||||||
spin_unlock_irq(&cc->write_thread_wait.lock);
|
spin_unlock_irq(&cc->write_thread_lock);
|
||||||
|
|
||||||
BUG_ON(rb_parent(write_tree.rb_node));
|
BUG_ON(rb_parent(write_tree.rb_node));
|
||||||
|
|
||||||
|
@ -1693,7 +1688,9 @@ static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int async)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&cc->write_thread_wait.lock, flags);
|
spin_lock_irqsave(&cc->write_thread_lock, flags);
|
||||||
|
if (RB_EMPTY_ROOT(&cc->write_tree))
|
||||||
|
wake_up_process(cc->write_thread);
|
||||||
rbp = &cc->write_tree.rb_node;
|
rbp = &cc->write_tree.rb_node;
|
||||||
parent = NULL;
|
parent = NULL;
|
||||||
sector = io->sector;
|
sector = io->sector;
|
||||||
|
@ -1706,9 +1703,7 @@ static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int async)
|
||||||
}
|
}
|
||||||
rb_link_node(&io->rb_node, parent, rbp);
|
rb_link_node(&io->rb_node, parent, rbp);
|
||||||
rb_insert_color(&io->rb_node, &cc->write_tree);
|
rb_insert_color(&io->rb_node, &cc->write_tree);
|
||||||
|
spin_unlock_irqrestore(&cc->write_thread_lock, flags);
|
||||||
wake_up_locked(&cc->write_thread_wait);
|
|
||||||
spin_unlock_irqrestore(&cc->write_thread_wait.lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
||||||
|
@ -2831,7 +2826,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_waitqueue_head(&cc->write_thread_wait);
|
spin_lock_init(&cc->write_thread_lock);
|
||||||
cc->write_tree = RB_ROOT;
|
cc->write_tree = RB_ROOT;
|
||||||
|
|
||||||
cc->write_thread = kthread_create(dmcrypt_write, cc, "dmcrypt_write");
|
cc->write_thread = kthread_create(dmcrypt_write, cc, "dmcrypt_write");
|
||||||
|
|
Loading…
Add table
Reference in a new issue