aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/device-mapper/dm-crypt.txt7
-rw-r--r--drivers/md/dm-crypt.c49
2 files changed, 40 insertions, 16 deletions
diff --git a/Documentation/device-mapper/dm-crypt.txt b/Documentation/device-mapper/dm-crypt.txt
index c81839b52c4d..571f24ffc91c 100644
--- a/Documentation/device-mapper/dm-crypt.txt
+++ b/Documentation/device-mapper/dm-crypt.txt
@@ -51,7 +51,7 @@ Parameters: <cipher> <key> <iv_offset> <device path> \
51 Otherwise #opt_params is the number of following arguments. 51 Otherwise #opt_params is the number of following arguments.
52 52
53 Example of optional parameters section: 53 Example of optional parameters section:
54 1 allow_discards 54 2 allow_discards same_cpu_crypt
55 55
56allow_discards 56allow_discards
57 Block discard requests (a.k.a. TRIM) are passed through the crypt device. 57 Block discard requests (a.k.a. TRIM) are passed through the crypt device.
@@ -63,6 +63,11 @@ allow_discards
63 used space etc.) if the discarded blocks can be located easily on the 63 used space etc.) if the discarded blocks can be located easily on the
64 device later. 64 device later.
65 65
66same_cpu_crypt
67 Perform encryption using the same cpu that IO was submitted on.
68 The default is to use an unbound workqueue so that encryption work
69 is automatically balanced between available CPUs.
70
66Example scripts 71Example scripts
67=============== 72===============
68LUKS (Linux Unified Key Setup) is now the preferred way to set up disk 73LUKS (Linux Unified Key Setup) is now the preferred way to set up disk
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 08981be7baa1..5063c901c0f5 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -108,7 +108,7 @@ struct iv_tcw_private {
108 * Crypt: maps a linear range of a block device 108 * Crypt: maps a linear range of a block device
109 * and encrypts / decrypts at the same time. 109 * and encrypts / decrypts at the same time.
110 */ 110 */
111enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID }; 111enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID, DM_CRYPT_SAME_CPU };
112 112
113/* 113/*
114 * The fields in here must be read only after initialization. 114 * The fields in here must be read only after initialization.
@@ -1688,7 +1688,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1688 char dummy; 1688 char dummy;
1689 1689
1690 static struct dm_arg _args[] = { 1690 static struct dm_arg _args[] = {
1691 {0, 1, "Invalid number of feature args"}, 1691 {0, 2, "Invalid number of feature args"},
1692 }; 1692 };
1693 1693
1694 if (argc < 5) { 1694 if (argc < 5) {
@@ -1788,15 +1788,23 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1788 if (ret) 1788 if (ret)
1789 goto bad; 1789 goto bad;
1790 1790
1791 opt_string = dm_shift_arg(&as); 1791 while (opt_params--) {
1792 opt_string = dm_shift_arg(&as);
1793 if (!opt_string) {
1794 ti->error = "Not enough feature arguments";
1795 goto bad;
1796 }
1792 1797
1793 if (opt_params == 1 && opt_string && 1798 if (!strcasecmp(opt_string, "allow_discards"))
1794 !strcasecmp(opt_string, "allow_discards")) 1799 ti->num_discard_bios = 1;
1795 ti->num_discard_bios = 1; 1800
1796 else if (opt_params) { 1801 else if (!strcasecmp(opt_string, "same_cpu_crypt"))
1797 ret = -EINVAL; 1802 set_bit(DM_CRYPT_SAME_CPU, &cc->flags);
1798 ti->error = "Invalid feature arguments"; 1803
1799 goto bad; 1804 else {
1805 ti->error = "Invalid feature arguments";
1806 goto bad;
1807 }
1800 } 1808 }
1801 } 1809 }
1802 1810
@@ -1807,8 +1815,11 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1807 goto bad; 1815 goto bad;
1808 } 1816 }
1809 1817
1810 cc->crypt_queue = alloc_workqueue("kcryptd", 1818 if (test_bit(DM_CRYPT_SAME_CPU, &cc->flags))
1811 WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 1); 1819 cc->crypt_queue = alloc_workqueue("kcryptd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 1);
1820 else
1821 cc->crypt_queue = alloc_workqueue("kcryptd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_UNBOUND,
1822 num_online_cpus());
1812 if (!cc->crypt_queue) { 1823 if (!cc->crypt_queue) {
1813 ti->error = "Couldn't create kcryptd queue"; 1824 ti->error = "Couldn't create kcryptd queue";
1814 goto bad; 1825 goto bad;
@@ -1860,6 +1871,7 @@ static void crypt_status(struct dm_target *ti, status_type_t type,
1860{ 1871{
1861 struct crypt_config *cc = ti->private; 1872 struct crypt_config *cc = ti->private;
1862 unsigned i, sz = 0; 1873 unsigned i, sz = 0;
1874 int num_feature_args = 0;
1863 1875
1864 switch (type) { 1876 switch (type) {
1865 case STATUSTYPE_INFO: 1877 case STATUSTYPE_INFO:
@@ -1878,8 +1890,15 @@ static void crypt_status(struct dm_target *ti, status_type_t type,
1878 DMEMIT(" %llu %s %llu", (unsigned long long)cc->iv_offset, 1890 DMEMIT(" %llu %s %llu", (unsigned long long)cc->iv_offset,
1879 cc->dev->name, (unsigned long long)cc->start); 1891 cc->dev->name, (unsigned long long)cc->start);
1880 1892
1881 if (ti->num_discard_bios) 1893 num_feature_args += !!ti->num_discard_bios;
1882 DMEMIT(" 1 allow_discards"); 1894 num_feature_args += test_bit(DM_CRYPT_SAME_CPU, &cc->flags);
1895 if (num_feature_args) {
1896 DMEMIT(" %d", num_feature_args);
1897 if (ti->num_discard_bios)
1898 DMEMIT(" allow_discards");
1899 if (test_bit(DM_CRYPT_SAME_CPU, &cc->flags))
1900 DMEMIT(" same_cpu_crypt");
1901 }
1883 1902
1884 break; 1903 break;
1885 } 1904 }
@@ -1976,7 +1995,7 @@ static int crypt_iterate_devices(struct dm_target *ti,
1976 1995
1977static struct target_type crypt_target = { 1996static struct target_type crypt_target = {
1978 .name = "crypt", 1997 .name = "crypt",
1979 .version = {1, 13, 0}, 1998 .version = {1, 14, 0},
1980 .module = THIS_MODULE, 1999 .module = THIS_MODULE,
1981 .ctr = crypt_ctr, 2000 .ctr = crypt_ctr,
1982 .dtr = crypt_dtr, 2001 .dtr = crypt_dtr,