lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 17 Jul 2014 16:17:00 +0200
From:	Jerome Marchand <jmarchan@...hat.com>
To:	Sergey Senozhatsky <sergey.senozhatsky@...il.com>,
	Timofey Titovets <nefelim4ag@...il.com>
CC:	minchan@...nel.org, linux-kernel@...r.kernel.org,
	Andrew Morton <akpm@...ux-foundation.org>,
	Nitin Gupta <ngupta@...are.org>
Subject: Re: [PATCH v2] zram: auto add/del devices on demand

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 07/17/2014 04:04 PM, Sergey Senozhatsky wrote:
> On (07/17/14 15:27), Timofey Titovets wrote:
>> This add supporting of autochange count of zram devices on
>> demand, like loop devices; This working by following rules: -
>> Always save minimum devices count specified by num_device (can
>> be specified while kernel module loading) - if last device
>> already using add new device; - if last and prelast devices is
>> free - delete last zram device;
>> 
>> Signed-off-by: Timofey Titovets <nefelim4ag@...il.com>
>> 
>> From v1 -> v2: Delete useless variable 'ret', added documentation
>> for explain new zram behaviour
>> 
>> Please pull from: https://github.com/Nefelim4ag/linux.git --- 
>> Tested on 3.15.5-2-ARCH, can be applied on any kernel version 
>> after this patch 'zram: add LZ4 compression support' -
>> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=6e76668e415adf799839f0ab205142ad7002d260
>>
>> 
- ---
>> diff --git a/Documentation/blockdev/zram.txt 
>> b/Documentation/blockdev/zram.txt index 0595c3f..7f5c921 100644 
>> --- a/Documentation/blockdev/zram.txt +++
>> b/Documentation/blockdev/zram.txt @@ -18,9 +18,19 @@ Following
>> shows a typical sequence of steps for using zram.
>> 
>> 1) Load Module: modprobe zram num_devices=4 -	This creates 4
>> devices: /dev/zram{0,1,2,3} +	This pre creates 4 devices:
>> /dev/zram{0,1,2,3} (num_devices parameter is optional. Default:
>> 1)
>> 
>> +	Kernel dynamically changes number of zram devices by demand +
>> (between num_devices and 31) +	If set disk size(4) for last
>> device +	kernel automatically adds new zram device +	If last two
>> devices have zero disk size after reset(8), +	kernel will destroy
>> last device + +	Summing up all features, comes one simple rule: +
>> "The last zram device is always free for use"
> 
> I can't understand what is the real benefit?
> 
> 
>> 2) Set max number of compression streams Compression backend may
>> use up to max_comp_streams compression streams, thus allowing up
>> to max_comp_streams concurrent compression operations. diff --git
>> a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c 
>> index 089e72c..9b2fc89 100644 ---
>> a/drivers/block/zram/zram_drv.c +++
>> b/drivers/block/zram/zram_drv.c @@ -42,6 +42,10 @@ static const
>> char *default_compressor = "lzo";
>> 
>> /* Module params (documentation at end) */ static unsigned int
>> num_devices = 1; +static unsigned int last_created_dev = 1; + 
>> +static void zram_add_dev(void); +static void
>> zram_del_dev(void); #define ZRAM_ATTR_RO(name)						\ static
>> ssize_t zram_attr_##name##_show(struct device *d,		\ @@ -168,6
>> +172,7 @@ static ssize_t comp_algorithm_store(struct device
>> *dev, struct device_attribute *attr, const char *buf, size_t
>> len) { struct zram *zram = dev_to_zram(dev); + 
>> down_write(&zram->init_lock); if (init_done(zram)) { 
>> up_write(&zram->init_lock); @@ -239,6 +244,7 @@ static struct
>> zram_meta *zram_meta_alloc(u64 disksize) { size_t num_pages; 
>> struct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL); + if
>> (!meta) goto out;
>> 
>> @@ -374,6 +380,7 @@ static int zram_bvec_read(struct zram *zram,
>> struct bio_vec *bvec, struct page *page; unsigned char *user_mem,
>> *uncmem = NULL; struct zram_meta *meta = zram->meta; + page =
>> bvec->bv_page;
>> 
>> read_lock(&meta->tb_lock); @@ -607,6 +614,7 @@ static void
>> zram_reset_device(struct zram *zram, bool reset_capacity) /* Free
>> all pages that are still in this zram device */ for (index = 0;
>> index < zram->disksize >> PAGE_SHIFT; index++) { unsigned long
>> handle = meta->table[index].handle; + if (!handle) continue;
>> 
>> @@ -668,6 +676,7 @@ static ssize_t disksize_store(struct device
>> *dev, set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); 
>> revalidate_disk(zram->disk); up_write(&zram->init_lock); +
>> zram_add_dev(); return len;
>> 
>> out_destroy_comp: @@ -712,6 +721,7 @@ static ssize_t
>> reset_store(struct device *dev, bdput(bdev);
>> 
>> zram_reset_device(zram, true); +	zram_del_dev(); return len;
>> 
>> out: @@ -954,6 +964,41 @@ static void destroy_device(struct zram
>> *zram) blk_cleanup_queue(zram->queue); }
>> 
>> +/* remove last free device, if last and prelast dev a free */ 
>> +static void zram_del_dev(void) +{ +	if (last_created_dev <
>> num_devices) +		return; + +	if
>> (zram_devices[last_created_dev].disksize == 0 && +
>> zram_devices[last_created_dev-1].disksize == 0 +		) {
> 
> racy?
> 
>> +		destroy_device(&zram_devices[last_created_dev]); +
>> last_created_dev--; +		pr_info("Deleted zram%u device\n",
>> last_created_dev); +	} +} + +/* Auto add empty zram device, if
>> last device in use */ +static void zram_add_dev(void) +{ +	if
>> (last_created_dev+1 > max_num_devices) { +		pr_warn("Can't add
>> zram%u, max device number reached\n", +			num_devices); +
>> return; +	}
> 
> racy?
> 
>> +	if (&zram_devices[last_created_dev].disksize > 0) { +
>> last_created_dev++; +		if
>> (create_device(&zram_devices[last_created_dev],
>> last_created_dev)) { +
>> destroy_device(&zram_devices[last_created_dev]); +
>> last_created_dev--;
> 
> racy?

Looks like it:

$ cat conctest.sh
#! /bin/sh

modprobe zram

while true; do
    for i in `seq 1 10`; do
	echo 10485760 > /sys/block/zram0/disksize&
	echo 1 > /sys/block/zram0/reset&
    done
done
$ sudo ./conctest.sh

[   51.535387] ------------[ cut here ]------------
[   51.536305] WARNING: CPU: 0 PID: 840 at fs/kernfs/dir.c:1209
kernfs_remove_by_name_ns+0x95/0xa0()
[   51.537908] kernfs: can not remove 'max_comp_streams', no directory
[   51.539089] Modules linked in: zram lz4_compress xt_conntrack
cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc
ebtable_filter ebtables ip6_tables iptable_nat nf_conntrack_ipv4
nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle
iptable_security iptable_raw ppdev crct10dif_pclmul crc32_pclmul
crc32c_intel joydev ghash_clmulni_intel microcode serio_raw pcspkr
virtio_balloon virtio_console parport_pc pvpanic virtio_net parport
floppy i2c_piix4 nfsd auth_rpcgss nfs_acl lockd sunrpc qxl
drm_kms_helper ttm virtio_blk drm virtio_pci virtio_ring virtio
ata_generic pata_acpi
[   51.550844] CPU: 0 PID: 840 Comm: conc_init.sh Tainted: G      D W
     3.16.0-rc5-memacct-next-20140715+ #146
[   51.552606] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[   51.553691]  0000000000000009 ffff880078343d20 ffffffff8172d344
ffff880078343d68
[   51.555412]  ffff880078343d58 ffffffff8108ad1d 0000000000000000
ffffffffa0320242
[   51.557811]  ffffffffa0321058 0000000000000002 ffff880078343f50
ffff880078343db8
[   51.559580] Call Trace:
[   51.560139]  [<ffffffff8172d344>] dump_stack+0x45/0x56
[   51.561161]  [<ffffffff8108ad1d>] warn_slowpath_common+0x7d/0xa0
[   51.562333]  [<ffffffff8108ad8c>] warn_slowpath_fmt+0x4c/0x50
[   51.563445]  [<ffffffff81218196>] ? evict+0x106/0x170
[   51.564432]  [<ffffffff81275695>] kernfs_remove_by_name_ns+0x95/0xa0
[   51.565627]  [<ffffffff81277ee9>] remove_files.isra.1+0x39/0x70
[   51.566753]  [<ffffffff812781f4>] sysfs_remove_group+0x44/0xa0
[   51.567870]  [<ffffffffa031e058>] destroy_device.isra.17+0x28/0x50
[zram]
[   51.569089]  [<ffffffffa031e5d0>] reset_store+0x100/0x140 [zram]
[   51.570197]  [<ffffffff8146c3e8>] dev_attr_store+0x18/0x30
[   51.571247]  [<ffffffff81276fd4>] sysfs_kf_write+0x44/0x60
[   51.572201]  [<ffffffff812768d7>] kernfs_fop_write+0xe7/0x170
[   51.573283]  [<ffffffff811fbcf7>] vfs_write+0xb7/0x1f0
[   51.574143]  [<ffffffff811fc8a9>] SyS_write+0x49/0xb0
[   51.574976]  [<ffffffff8112e724>] ? __audit_syscall_entry+0xb4/0x110
[   51.576213]  [<ffffffff817362a9>] system_call_fastpath+0x16/0x1b
[   51.577422] ---[ end trace cdb79035dad379f3 ]---
[   51.578401] ------------[ cut here ]------------
[   51.579354] WARNING: CPU: 0 PID: 840 at fs/kernfs/dir.c:1209
kernfs_remove_by_name_ns+0x95/0xa0()
[   51.580966] kernfs: can not remove 'comp_algorithm', no directory
[   51.582108] Modules linked in: zram lz4_compress xt_conntrack
cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc
ebtable_filter ebtables ip6_tables iptable_nat nf_conntrack_ipv4
nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle
iptable_security iptable_raw ppdev crct10dif_pclmul crc32_pclmul
crc32c_intel joydev ghash_clmulni_intel microcode serio_raw pcspkr
virtio_balloon virtio_console parport_pc pvpanic virtio_net parport
floppy i2c_piix4 nfsd auth_rpcgss nfs_acl lockd sunrpc qxl
drm_kms_helper ttm virtio_blk drm virtio_pci virtio_ring virtio
ata_generic pata_acpi
[   51.597177] CPU: 0 PID: 840 Comm: conc_init.sh Tainted: G      D W
     3.16.0-rc5-memacct-next-20140715+ #146
[   51.598549] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[   51.599661]  0000000000000009 ffff880078343d20 ffffffff8172d344
ffff880078343d68
[   51.601519]  ffff880078343d58 ffffffff8108ad1d 0000000000000000
ffffffffa0320233
[   51.603362]  ffffffffa0321058 0000000000000002 ffff880078343f50
ffff880078343db8
[   51.604913] Call Trace:
[   51.605444]  [<ffffffff8172d344>] dump_stack+0x45/0x56
[   51.606537]  [<ffffffff8108ad1d>] warn_slowpath_common+0x7d/0xa0
[   51.607507]  [<ffffffff8108ad8c>] warn_slowpath_fmt+0x4c/0x50
[   51.608582]  [<ffffffff81218196>] ? evict+0x106/0x170
[   51.609423]  [<ffffffff81275695>] kernfs_remove_by_name_ns+0x95/0xa0
[   51.610436]  [<ffffffff81277ee9>] remove_files.isra.1+0x39/0x70
[   51.611408]  [<ffffffff812781f4>] sysfs_remove_group+0x44/0xa0
[   51.612431]  [<ffffffffa031e058>] destroy_device.isra.17+0x28/0x50
[zram]
[   51.613214]  [<ffffffffa031e5d0>] reset_store+0x100/0x140 [zram]
[   51.613928]  [<ffffffff8146c3e8>] dev_attr_store+0x18/0x30
[   51.614634]  [<ffffffff81276fd4>] sysfs_kf_write+0x44/0x60
[   51.615387]  [<ffffffff812768d7>] kernfs_fop_write+0xe7/0x170
[   51.616246]  [<ffffffff811fbcf7>] vfs_write+0xb7/0x1f0
[   51.619107]  [<ffffffff811fc8a9>] SyS_write+0x49/0xb0
[   51.620063]  [<ffffffff8112e724>] ? __audit_syscall_entry+0xb4/0x110
[   51.622071]  [<ffffffff817362a9>] system_call_fastpath+0x16/0x1b
[   51.623256] ---[ end trace cdb79035dad379f4 ]---

And lots more of similar messages.

Jerome

> 
> 
> -ss
> 
> 
>> +			return; +		} +		pr_info("Created zram%u device\n",
>> last_created_dev); +	} +} + static int __init zram_init(void) { 
>> int ret, dev_id; @@ -972,18 +1017,20 @@ static int __init
>> zram_init(void) goto out; }
>> 
>> -	/* Allocate the device array and initialize each one */ -
>> zram_devices = kzalloc(num_devices * sizeof(struct zram),
>> GFP_KERNEL); +	/* Allocate the device array */ +	zram_devices =
>> kcalloc(max_num_devices, sizeof(struct zram), GFP_KERNEL); if
>> (!zram_devices) { ret = -ENOMEM; goto unregister; }
>> 
>> +	/* Initialise zram{0..num_devices} */ for (dev_id = 0; dev_id <
>> num_devices; dev_id++) { ret =
>> create_device(&zram_devices[dev_id], dev_id); if (ret) goto
>> free_devices; } +	last_created_dev = num_devices-1;
>> 
>> pr_info("Created %u device(s) ...\n", num_devices);
>> 
>> @@ -1004,7 +1051,7 @@ static void __exit zram_exit(void) int i; 
>> struct zram *zram;
>> 
>> -	for (i = 0; i < num_devices; i++) { +	for (i = 0; i <
>> last_created_dev+1; i++) { zram = &zram_devices[i];
>> 
>> destroy_device(zram); @@ -1025,7 +1072,7 @@
>> module_init(zram_init); module_exit(zram_exit);
>> 
>> module_param(num_devices, uint, 0); 
>> -MODULE_PARM_DESC(num_devices, "Number of zram devices"); 
>> +MODULE_PARM_DESC(num_devices, "Number of pre created  zram
>> devices");
>> 
>> MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Nitin Gupta
>> <ngupta@...are.org>");
>> 

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJTx9rXAAoJEHTzHJCtsuoC2UAH/1k+IhcKZjcj8526VTnUdYNX
SEJuVbiDU/8qeTLevw15+JLrYVeaoRIincjPVU+J2d0eiobHjdDcx6oSZ/d8ryb3
hKy3r209Thii0LJiqiHL9+8NBGZNldgoirz74PWYUoB+XlSo9mA3OcX1+TDJWgSu
SytEUCX+viaclfVwCU+zU10X/Pd8m+AxWXf8zKdIcpE44iGvw+vDx/G8wV2N5ATy
0D/cLZsYMAkNXMap0eCS61oq4ZDdEAi13+563fKpinKqcK0sV41LMBiWbGR0rFm3
BAbZVHAlT7YPnpohlVUqEsxgp38sLNpeBKNi9JR9B4vlMEmsLBuW4FWG9/ibCA4=
=VOGL
-----END PGP SIGNATURE-----
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ