diff options
author | Milan Broz <mbroz@redhat.com> | 2007-10-19 17:38:57 -0400 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2007-10-19 21:01:13 -0400 |
commit | 9934a8bea2fc67e6f07d74304eca2a91d251bfe8 (patch) | |
tree | e2ea4b65a1fa4ad8d2a2dd8b755a7abaf91849c4 /drivers/md/dm-crypt.c | |
parent | d336416ff1e6f7715f6dcb3b4e3e60626e406dd0 (diff) |
dm crypt: use per device singlethread workqueues
Use a separate single-threaded workqueue for each crypt device
instead of one global workqueue.
Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md/dm-crypt.c')
-rw-r--r-- | drivers/md/dm-crypt.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 3fa3b24947da..126ed21e6b17 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -80,6 +80,7 @@ struct crypt_config { | |||
80 | mempool_t *page_pool; | 80 | mempool_t *page_pool; |
81 | struct bio_set *bs; | 81 | struct bio_set *bs; |
82 | 82 | ||
83 | struct workqueue_struct *queue; | ||
83 | /* | 84 | /* |
84 | * crypto related data | 85 | * crypto related data |
85 | */ | 86 | */ |
@@ -480,13 +481,14 @@ static void dec_pending(struct dm_crypt_io *io, int error) | |||
480 | * Needed because it would be very unwise to do decryption in an | 481 | * Needed because it would be very unwise to do decryption in an |
481 | * interrupt context. | 482 | * interrupt context. |
482 | */ | 483 | */ |
483 | static struct workqueue_struct *_kcryptd_workqueue; | ||
484 | static void kcryptd_do_work(struct work_struct *work); | 484 | static void kcryptd_do_work(struct work_struct *work); |
485 | 485 | ||
486 | static void kcryptd_queue_io(struct dm_crypt_io *io) | 486 | static void kcryptd_queue_io(struct dm_crypt_io *io) |
487 | { | 487 | { |
488 | struct crypt_config *cc = io->target->private; | ||
489 | |||
488 | INIT_WORK(&io->work, kcryptd_do_work); | 490 | INIT_WORK(&io->work, kcryptd_do_work); |
489 | queue_work(_kcryptd_workqueue, &io->work); | 491 | queue_work(cc->queue, &io->work); |
490 | } | 492 | } |
491 | 493 | ||
492 | static void crypt_endio(struct bio *clone, int error) | 494 | static void crypt_endio(struct bio *clone, int error) |
@@ -868,9 +870,17 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
868 | } else | 870 | } else |
869 | cc->iv_mode = NULL; | 871 | cc->iv_mode = NULL; |
870 | 872 | ||
873 | cc->queue = create_singlethread_workqueue("kcryptd"); | ||
874 | if (!cc->queue) { | ||
875 | ti->error = "Couldn't create kcryptd queue"; | ||
876 | goto bad_queue; | ||
877 | } | ||
878 | |||
871 | ti->private = cc; | 879 | ti->private = cc; |
872 | return 0; | 880 | return 0; |
873 | 881 | ||
882 | bad_queue: | ||
883 | kfree(cc->iv_mode); | ||
874 | bad_iv_mode: | 884 | bad_iv_mode: |
875 | dm_put_device(ti, cc->dev); | 885 | dm_put_device(ti, cc->dev); |
876 | bad5: | 886 | bad5: |
@@ -895,7 +905,7 @@ static void crypt_dtr(struct dm_target *ti) | |||
895 | { | 905 | { |
896 | struct crypt_config *cc = (struct crypt_config *) ti->private; | 906 | struct crypt_config *cc = (struct crypt_config *) ti->private; |
897 | 907 | ||
898 | flush_workqueue(_kcryptd_workqueue); | 908 | destroy_workqueue(cc->queue); |
899 | 909 | ||
900 | bioset_free(cc->bs); | 910 | bioset_free(cc->bs); |
901 | mempool_destroy(cc->page_pool); | 911 | mempool_destroy(cc->page_pool); |
@@ -1040,25 +1050,12 @@ static int __init dm_crypt_init(void) | |||
1040 | if (!_crypt_io_pool) | 1050 | if (!_crypt_io_pool) |
1041 | return -ENOMEM; | 1051 | return -ENOMEM; |
1042 | 1052 | ||
1043 | _kcryptd_workqueue = create_workqueue("kcryptd"); | ||
1044 | if (!_kcryptd_workqueue) { | ||
1045 | r = -ENOMEM; | ||
1046 | DMERR("couldn't create kcryptd"); | ||
1047 | goto bad1; | ||
1048 | } | ||
1049 | |||
1050 | r = dm_register_target(&crypt_target); | 1053 | r = dm_register_target(&crypt_target); |
1051 | if (r < 0) { | 1054 | if (r < 0) { |
1052 | DMERR("register failed %d", r); | 1055 | DMERR("register failed %d", r); |
1053 | goto bad2; | 1056 | kmem_cache_destroy(_crypt_io_pool); |
1054 | } | 1057 | } |
1055 | 1058 | ||
1056 | return 0; | ||
1057 | |||
1058 | bad2: | ||
1059 | destroy_workqueue(_kcryptd_workqueue); | ||
1060 | bad1: | ||
1061 | kmem_cache_destroy(_crypt_io_pool); | ||
1062 | return r; | 1059 | return r; |
1063 | } | 1060 | } |
1064 | 1061 | ||
@@ -1069,7 +1066,6 @@ static void __exit dm_crypt_exit(void) | |||
1069 | if (r < 0) | 1066 | if (r < 0) |
1070 | DMERR("unregister failed %d", r); | 1067 | DMERR("unregister failed %d", r); |
1071 | 1068 | ||
1072 | destroy_workqueue(_kcryptd_workqueue); | ||
1073 | kmem_cache_destroy(_crypt_io_pool); | 1069 | kmem_cache_destroy(_crypt_io_pool); |
1074 | } | 1070 | } |
1075 | 1071 | ||