android_kernel_samsung_msm8226/drivers/ide
Steve Kondik b0bda35dbd mm: Backport ZRAM/ZSMALLOC from Google kernel
Change-Id: Ib07ead1e23e816c96552254c049016825a164f2c

UPSTREAM: zram/zcomp: use GFP_NOIO to allocate streams

(cherry picked from commit 3d5fe03a3ea013060ebba2a811aeb0f23f56aefa)

We can end up allocating a new compression stream with GFP_KERNEL from
within the IO path, which may result is nested (recursive) IO
operations.  That can introduce problems if the IO path in question is a
reclaimer, holding some locks that will deadlock nested IOs.

Allocate streams and working memory using GFP_NOIO flag, forbidding
recursive IO and FS operations.

An example:

  inconsistent {IN-RECLAIM_FS-W} -> {RECLAIM_FS-ON-W} usage.
  git/20158 [HC0[0]:SC0[0]:HE1:SE1] takes:
   (jbd2_handle){+.+.?.}, at:  start_this_handle+0x4ca/0x555
  {IN-RECLAIM_FS-W} state was registered at:
     __lock_acquire+0x8da/0x117b
     lock_acquire+0x10c/0x1a7
     start_this_handle+0x52d/0x555
     jbd2__journal_start+0xb4/0x237
     __ext4_journal_start_sb+0x108/0x17e
     ext4_dirty_inode+0x32/0x61
     __mark_inode_dirty+0x16b/0x60c
     iput+0x11e/0x274
     __dentry_kill+0x148/0x1b8
     shrink_dentry_list+0x274/0x44a
     prune_dcache_sb+0x4a/0x55
     super_cache_scan+0xfc/0x176
     shrink_slab.part.14.constprop.25+0x2a2/0x4d3
     shrink_zone+0x74/0x140
     kswapd+0x6b7/0x930
     kthread+0x107/0x10f
     ret_from_fork+0x3f/0x70
  irq event stamp: 138297
  hardirqs last  enabled at (138297):  debug_check_no_locks_freed+0x113/0x12f
  hardirqs last disabled at (138296):  debug_check_no_locks_freed+0x33/0x12f
  softirqs last  enabled at (137818):  __do_softirq+0x2d3/0x3e9
  softirqs last disabled at (137813):  irq_exit+0x41/0x95

               other info that might help us debug this:
   Possible unsafe locking scenario:
         CPU0
         ----
    lock(jbd2_handle);
    <Interrupt>
      lock(jbd2_handle);

                *** DEADLOCK ***
  5 locks held by git/20158:
   #0:  (sb_writers#7){.+.+.+}, at: [<ffffffff81155411>] mnt_want_write+0x24/0x4b
   #1:  (&type->i_mutex_dir_key#2/1){+.+.+.}, at: [<ffffffff81145087>] lock_rename+0xd9/0xe3
   #2:  (&sb->s_type->i_mutex_key#11){+.+.+.}, at: [<ffffffff8114f8e2>] lock_two_nondirectories+0x3f/0x6b
   #3:  (&sb->s_type->i_mutex_key#11/4){+.+.+.}, at: [<ffffffff8114f909>] lock_two_nondirectories+0x66/0x6b
   #4:  (jbd2_handle){+.+.?.}, at: [<ffffffff811e31db>] start_this_handle+0x4ca/0x555

               stack backtrace:
  CPU: 2 PID: 20158 Comm: git Not tainted 4.1.0-rc7-next-20150615-dbg-00016-g8bdf555-dirty #211
  Call Trace:
    dump_stack+0x4c/0x6e
    mark_lock+0x384/0x56d
    mark_held_locks+0x5f/0x76
    lockdep_trace_alloc+0xb2/0xb5
    kmem_cache_alloc_trace+0x32/0x1e2
    zcomp_strm_alloc+0x25/0x73 [zram]
    zcomp_strm_multi_find+0xe7/0x173 [zram]
    zcomp_strm_find+0xc/0xe [zram]
    zram_bvec_rw+0x2ca/0x7e0 [zram]
    zram_make_request+0x1fa/0x301 [zram]
    generic_make_request+0x9c/0xdb
    submit_bio+0xf7/0x120
    ext4_io_submit+0x2e/0x43
    ext4_bio_write_page+0x1b7/0x300
    mpage_submit_page+0x60/0x77
    mpage_map_and_submit_buffers+0x10f/0x21d
    ext4_writepages+0xc8c/0xe1b
    do_writepages+0x23/0x2c
    __filemap_fdatawrite_range+0x84/0x8b
    filemap_flush+0x1c/0x1e
    ext4_alloc_da_blocks+0xb8/0x117
    ext4_rename+0x132/0x6dc
    ? mark_held_locks+0x5f/0x76
    ext4_rename2+0x29/0x2b
    vfs_rename+0x540/0x636
    SyS_renameat2+0x359/0x44d
    SyS_rename+0x1e/0x20
    entry_SYSCALL_64_fastpath+0x12/0x6f

[minchan@kernel.org: add stable mark]
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Acked-by: Minchan Kim <minchan@kernel.org>
Cc: Kyeongdon Kim <kyeongdon.kim@lge.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

UPSTREAM: zram: try vmalloc() after kmalloc()

(cherry picked from commit d913897abace843bba20249f3190167f7895e9c3)

When we're using LZ4 multi compression streams for zram swap, we found
out page allocation failure message in system running test.  That was
not only once, but a few(2 - 5 times per test).  Also, some failure
cases were continually occurring to try allocation order 3.

In order to make parallel compression private data, we should call
kzalloc() with order 2/3 in runtime(lzo/lz4).  But if there is no order
2/3 size memory to allocate in that time, page allocation fails.  This
patch makes to use vmalloc() as fallback of kmalloc(), this prevents
page alloc failure warning.

After using this, we never found warning message in running test, also
It could reduce process startup latency about 60-120ms in each case.

For reference a call trace :

    Binder_1: page allocation failure: order:3, mode:0x10c0d0
    CPU: 0 PID: 424 Comm: Binder_1 Tainted: GW 3.10.49-perf-g991d02b-dirty #20
    Call trace:
      dump_backtrace+0x0/0x270
      show_stack+0x10/0x1c
      dump_stack+0x1c/0x28
      warn_alloc_failed+0xfc/0x11c
      __alloc_pages_nodemask+0x724/0x7f0
      __get_free_pages+0x14/0x5c
      kmalloc_order_trace+0x38/0xd8
      zcomp_lz4_create+0x2c/0x38
      zcomp_strm_alloc+0x34/0x78
      zcomp_strm_multi_find+0x124/0x1ec
      zcomp_strm_find+0xc/0x18
      zram_bvec_rw+0x2fc/0x780
      zram_make_request+0x25c/0x2d4
      generic_make_request+0x80/0xbc
      submit_bio+0xa4/0x15c
      __swap_writepage+0x218/0x230
      swap_writepage+0x3c/0x4c
      shrink_page_list+0x51c/0x8d0
      shrink_inactive_list+0x3f8/0x60c
      shrink_lruvec+0x33c/0x4cc
      shrink_zone+0x3c/0x100
      try_to_free_pages+0x2b8/0x54c
      __alloc_pages_nodemask+0x514/0x7f0
      __get_free_pages+0x14/0x5c
      proc_info_read+0x50/0xe4
      vfs_read+0xa0/0x12c
      SyS_read+0x44/0x74
    DMA: 3397*4kB (MC) 26*8kB (RC) 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB
         0*512kB 0*1024kB 0*2048kB 0*4096kB = 13796kB

[minchan@kernel.org: change vmalloc gfp and adding comment about gfp]
[sergey.senozhatsky@gmail.com: tweak comments and styles]
Signed-off-by: Kyeongdon Kim <kyeongdon.kim@lge.com>
Signed-off-by: Minchan Kim <minchan@kernel.org>
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

UPSTREAM: zram: pass gfp from zcomp frontend to backend

(cherry picked from commit 75d8947a36d0c9aedd69118d1f14bf424005c7c2)

Each zcomp backend uses own gfp flag but it's pointless because the
context they could be called is driven by upper layer(ie, zcomp
frontend).  As well, zcomp frondend could call them in different
context.  One context(ie, zram init part) is it should be better to make
sure successful allocation other context(ie, further stream allocation
part for accelarating I/O speed) is just optional so let's pass gfp down
from driver (ie, zcomp frontend) like normal MM convention.

[sergey.senozhatsky@gmail.com: add missing __vmalloc zero and highmem gfps]
Signed-off-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

UPSTREAM: zram/zcomp: do not zero out zcomp private pages

(cherry picked from commit e02d238c9852a91b30da9ea32ce36d1416cdc683)

Do not __GFP_ZERO allocated zcomp ->private pages.  We keep allocated
streams around and use them for read/write requests, so we supply a
zeroed out ->private to compression algorithm as a scratch buffer only
once -- the first time we use that stream.  For the rest of IO requests
served by this stream ->private usually contains some temporarily data
from the previous requests.

Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Acked-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

UPSTREAM: block: disable entropy contributions for nonrot devices

(cherry picked from commit b277da0a8a594308e17881f4926879bd5fca2a2d)

Clear QUEUE_FLAG_ADD_RANDOM in all block drivers that set
QUEUE_FLAG_NONROT.

Historically, all block devices have automatically made entropy
contributions.  But as previously stated in commit e2e1a148 ("block: add
sysfs knob for turning off disk entropy contributions"):
    - On SSD disks, the completion times aren't as random as they
      are for rotational drives. So it's questionable whether they
      should contribute to the random pool in the first place.
    - Calling add_disk_randomness() has a lot of overhead.

There are more reliable sources for randomness than non-rotational block
devices.  From a security perspective it is better to err on the side of
caution than to allow entropy contributions from unreliable "random"
sources.

Change-Id: I2a4f86bacee8786e2cb1a82d45156338f79d64e0
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Signed-off-by: Kevin F. Haggerty <haggertk@lineageos.org>
2019-08-06 08:17:38 +02:00
..
Kconfig Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2011-11-03 13:28:14 -07:00
Makefile ARM: at91: drop ide driver in favor of the pata one 2012-02-13 18:31:37 +01:00
aec62xx.c
ali14xx.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
alim15x3.c
amd74xx.c
atiixp.c
au1xxx-ide.c MIPS: Alchemy: kill au1xxx.h header 2011-10-24 23:34:24 +01:00
buddha.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
cmd64x.c
cmd640.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
cs5520.c
cs5530.c
cs5535.c
cs5536.c
cy82c693.c cy82c693: fix PCI device selection 2011-10-13 17:04:50 -04:00
delkin_cb.c
dtc2278.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
falconide.c
gayle.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
hpt366.c
ht6560b.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
icside.c icside: DMA support fix 2011-10-13 17:04:50 -04:00
ide-4drives.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
ide-acpi.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
ide-atapi.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-cd.c ide-{cd,floppy,tape}: Do not include <linux/irq.h> 2011-11-08 22:35:46 +01:00
ide-cd.h ide: Convert to bdops->check_events() 2011-03-09 19:54:27 +01:00
ide-cd_ioctl.c ide: unexport DISK_EVENT_MEDIA_CHANGE for ide-gd and ide-cd 2011-04-21 19:43:59 +02:00
ide-cd_verbose.c
ide-cs.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
ide-devsets.c
ide-disk.c mm: Backport ZRAM/ZSMALLOC from Google kernel 2019-08-06 08:17:38 +02:00
ide-disk.h
ide-disk_ioctl.c
ide-disk_proc.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-dma-sff.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-dma.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-eh.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-floppy.c ide-{cd,floppy,tape}: Do not include <linux/irq.h> 2011-11-08 22:35:46 +01:00
ide-floppy.h
ide-floppy_ioctl.c block: add and use scsi_blk_cmd_ioctl 2012-01-14 15:07:24 -08:00
ide-floppy_proc.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-gd.c ide: unexport DISK_EVENT_MEDIA_CHANGE for ide-gd and ide-cd 2011-04-21 19:43:59 +02:00
ide-gd.h
ide-generic.c
ide-h8300.c
ide-io-std.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-io.c ide: always ensure that blk_delay_queue() is called if we have pending IO 2011-04-05 23:52:49 +02:00
ide-ioctls.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-iops.c
ide-legacy.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-lib.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide-park.c block: remove per-queue plugging 2011-03-10 08:52:07 +01:00
ide-pci-generic.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
ide-pio-blacklist.c
ide-pm.c
ide-pnp.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
ide-probe.c
ide-proc.c
ide-scan-pci.c ide/ide-scan-pci.c: Use for_each_pci_dev(). 2011-05-16 14:24:46 -07:00
ide-sysfs.c
ide-tape.c ide-{cd,floppy,tape}: Do not include <linux/irq.h> 2011-11-08 22:35:46 +01:00
ide-taskfile.c ide: remove the second argument of k[un]map_atomic() 2012-03-20 21:48:17 +08:00
ide-timings.c
ide-xfer-mode.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
ide.c
ide_platform.c ide: Fix irq flags madness 2011-08-04 01:29:51 -07:00
it821x.c
it8172.c
it8213.c
jmicron.c
macide.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
ns87415.c
opti621.c
palm_bk3710.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
pdc202xx_new.c
pdc202xx_old.c
piix.c piix: ICH7 MWDMA1 errata 2011-10-11 15:19:43 -04:00
pmac.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
q40ide.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
qd65xx.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
qd65xx.h
rapide.c
rz1000.c
sc1200.c
scc_pata.c
serverworks.c
setup-pci.c ide/ata: Add export.h for EXPORT_SYMBOL/THIS_MODULE where needed 2011-10-31 19:31:37 -04:00
sgiioc4.c
siimage.c
sis5513.c Fix common misspellings 2011-03-31 11:26:23 -03:00
sl82c105.c
slc90e66.c
tc86c001.c ide/ata: Add module.h to the implicit modular users 2011-10-31 19:31:37 -04:00
triflex.c IDE: Don't powerdown Compaq Triflex IDE device on suspend 2011-10-13 17:04:49 -04:00
trm290.c
tx4938ide.c
tx4939ide.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
umc8672.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
via82cxxx.c Fix common misspellings 2011-03-31 11:26:23 -03:00