FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Device-mapper Development

 
 
LinkBack Thread Tools
 
Old 08-21-2012, 09:09 AM
Mikulas Patocka
 
Default dm-crypt: Unify spinlock

Remove "crypt_thread_spinlock" and use wait queue spinlock
"crypt_thread_wait.spinlock" instead.

This saves few atomic operations in the encryption thread.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
---
drivers/md/dm-crypt.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index cb0e26f..b251e15 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -130,7 +130,6 @@ struct crypt_config {
struct task_struct **crypt_threads;

wait_queue_head_t crypt_thread_wait;
- spinlock_t crypt_thread_spinlock;
struct list_head crypt_thread_list;

char *cipher;
@@ -680,15 +679,16 @@ static int dmcrypt_thread(void *data)

DECLARE_WAITQUEUE(wait, current);

- spin_lock(&cc->crypt_thread_spinlock);
+ spin_lock_irq(&cc->crypt_thread_wait.lock);
+continue_locked:

if (!list_empty(&cc->crypt_thread_list))
goto pop_from_list;

__set_current_state(TASK_INTERRUPTIBLE);
- add_wait_queue(&cc->crypt_thread_wait, &wait);
+ __add_wait_queue(&cc->crypt_thread_wait, &wait);

- spin_unlock(&cc->crypt_thread_spinlock);
+ spin_unlock_irq(&cc->crypt_thread_wait.lock);

if (unlikely(kthread_should_stop())) {
set_task_state(current, TASK_RUNNING);
@@ -699,8 +699,9 @@ static int dmcrypt_thread(void *data)
schedule();

set_task_state(current, TASK_RUNNING);
- remove_wait_queue(&cc->crypt_thread_wait, &wait);
- continue;
+ spin_lock_irq(&cc->crypt_thread_wait.lock);
+ __remove_wait_queue(&cc->crypt_thread_wait, &wait);
+ goto continue_locked;

pop_from_list:
n_dmreqs = 0;
@@ -712,7 +713,8 @@ pop_from_list:
dmreqs[n_dmreqs++] = dmreq;
} while (n_dmreqs < DMREQ_PULL_BATCH &&
!list_empty(&cc->crypt_thread_list));
- spin_unlock(&cc->crypt_thread_spinlock);
+
+ spin_unlock_irq(&cc->crypt_thread_wait.lock);

i = 0;
do {
@@ -805,10 +807,10 @@ static struct ablkcipher_request *crypt_alloc_req(struct crypt_config *cc,

static void crypt_flush_batch(struct crypt_config *cc, struct list_head *batch)
{
- spin_lock(&cc->crypt_thread_spinlock);
+ spin_lock_irq(&cc->crypt_thread_wait.lock);
list_splice_tail(batch, &cc->crypt_thread_list);
- spin_unlock(&cc->crypt_thread_spinlock);
- wake_up_all(&cc->crypt_thread_wait);
+ wake_up_locked(&cc->crypt_thread_wait);
+ spin_unlock_irq(&cc->crypt_thread_wait.lock);
INIT_LIST_HEAD(batch);
}

@@ -1750,7 +1752,6 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
cc->crypt_threads_size = i + 1;

init_waitqueue_head(&cc->crypt_thread_wait);
- spin_lock_init(&cc->crypt_thread_spinlock);
INIT_LIST_HEAD(&cc->crypt_thread_list);

cc->crypt_threads = kzalloc(cc->crypt_threads_size *
--
1.7.10.4

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
 

Thread Tools




All times are GMT. The time now is 04:03 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org