Skip to content
Snippets Groups Projects
Select Git revision
  • 2f6fa6bb65962fdce2415150afd04af88559b9d4
  • master default protected
  • android-msm-bullhead-3.10-nougat_kgdb_less_changes
  • android-msm-bullhead-3.10-nougat_kgdb
  • android-msm-bullhead-3.10-nougat_klist
  • android-4.4
  • android-msm-vega-4.4-oreo-daydream
  • android-msm-wahoo-4.4-p-preview-5
  • android-msm-wahoo-4.4-pie
  • android-msm-marlin-3.18-p-preview-5
  • android-msm-marlin-3.18-pie
  • android-msm-wahoo-2018.07-oreo-m2
  • android-msm-wahoo-2018.07-oreo-m4
  • android-msm-wahoo-4.4-p-preview-4
  • android-msm-bullhead-3.10-oreo-m6
  • android-msm-angler-3.10-oreo-m6
  • android-msm-marlin-3.18-p-preview-4
  • android-msm-stargazer-3.18-oreo-wear-dr
  • android-msm-catshark-3.18-oreo-wear-dr
  • android-msm-wahoo-4.4-oreo-m2
  • android-msm-wahoo-4.4-oreo-m4
  • android-daydreamos-8.0.0_r0.5
  • android-8.1.0_r0.92
  • android-8.1.0_r0.91
  • android-daydreamos-8.0.0_r0.4
  • android-p-preview-5_r0.2
  • android-p-preview-5_r0.1
  • android-9.0.0_r0.5
  • android-9.0.0_r0.4
  • android-9.0.0_r0.2
  • android-9.0.0_r0.1
  • android-8.1.0_r0.81
  • android-8.1.0_r0.80
  • android-8.1.0_r0.78
  • android-8.1.0_r0.76
  • android-8.1.0_r0.75
  • android-8.1.0_r0.72
  • android-8.1.0_r0.70
  • android-p-preview-4_r0.2
  • android-p-preview-4_r0.1
  • android-wear-8.0.0_r0.30
41 results

Documentation

  • Clone with SSH
  • Clone with HTTPS
  • user avatar
    Minchan Kim authored and Ajay Dudani committed
    3.15 upstream has many patches to zram that significantly improve
    performance. Rebase zram and zsmalloc from that time.
    
    zsmalloc: move it under mm
    
    This patch moves zsmalloc under mm directory.
    
    Before that, description will explain why we have needed custom
    allocator.
    
    Zsmalloc is a new slab-based memory allocator for storing compressed
    pages.  It is designed for low fragmentation and high allocation success
    rate on large object, but <= PAGE_SIZE allocations.
    
    zsmalloc differs from the kernel slab allocator in two primary ways to
    achieve these design goals.
    
    zsmalloc never requires high order page allocations to back slabs, or
    "size classes" in zsmalloc terms.  Instead it allows multiple
    single-order pages to be stitched together into a "zspage" which backs
    the slab.  This allows for higher allocation success rate under memory
    pressure.
    
    Also, zsmalloc allows objects to span page boundaries within the zspage.
    This allows for lower fragmentation than could be had with the kernel
    slab allocator for objects between PAGE_SIZE/2 and PAGE_SIZE.  With the
    kernel slab allocator, if a page compresses to 60% of it original size,
    the memory savings gained through compression is lost in fragmentation
    because another object of the same size can't be stored in the leftover
    space.
    
    This ability to span pages results in zsmalloc allocations not being
    directly addressable by the user.  The user is given an
    non-dereferencable handle in response to an allocation request.  That
    handle must be mapped, using zs_map_object(), which returns a pointer to
    the mapped region that can be used.  The mapping is necessary since the
    object data may reside in two different noncontigious pages.
    
    The zsmalloc fulfills the allocation needs for zram perfectly
    
    [sjenning@linux.vnet.ibm.com: borrow Seth's quote]
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarNitin Gupta <ngupta@vflare.org>
    Reviewed-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Cc: Bob Liu <bob.liu@oracle.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Luigi Semenzato <semenzato@google.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Seth Jennings <sjenning@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    (cherry picked from commit bcf1647d)
    
    Change-Id: Id6d44d6b743131eac94009d6765dcf2ae097501e
    
    zsmalloc: add copyright
    
    Add my copyright to the zsmalloc source code which I maintain.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 31fc00bb)
    
    zsmalloc: Fix CPU hotplug callback registration
    
    Subsystems that want to register CPU hotplug callbacks, as well as perform
    initialization for the CPUs that are already online, often do it as shown
    below:
    
    	get_online_cpus();
    
    	for_each_online_cpu(cpu)
    		init_cpu(cpu);
    
    	register_cpu_notifier(&foobar_cpu_notifier);
    
    	put_online_cpus();
    
    This is wrong, since it is prone to ABBA deadlocks involving the
    cpu_add_remove_lock and the cpu_hotplug.lock (when running concurrently
    with CPU hotplug operations).
    
    Instead, the correct and race-free way of performing the callback
    registration is:
    
    	cpu_notifier_register_begin();
    
    	for_each_online_cpu(cpu)
    		init_cpu(cpu);
    
    	/* Note the use of the double underscored version of the API */
    	__register_cpu_notifier(&foobar_cpu_notifier);
    
    	cpu_notifier_register_done();
    
    Fix the zsmalloc code by using this latter form of callback registration.
    
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    (cherry picked from commit f0e71fcd)
    
    zram: remove drivers/staging/zram.
    
    Prepare for rebase to newer zram.
    
    Change-Id: I1985eb6c9abacf018e5ff597314723f68828f1e9
    
    zram: promote zram from staging
    
    Zram has lived in staging for a LONG LONG time and have been
    fixed/improved by many contributors so code is clean and stable now.  Of
    course, there are lots of product using zram in real practice.
    
    The major TV companys have used zram as swap since two years ago and
    recently our production team released android smart phone with zram
    which is used as swap, too and recently Android Kitkat start to use zram
    for small memory smart phone.  And there was a report Google released
    their ChromeOS with zram, too and cyanogenmod have been used zram long
    time ago.  And I heard some disto have used zram block device for tmpfs.
    In addition, I saw many report from many other peoples.  For example,
    Lubuntu start to use it.
    
    The benefit of zram is very clear.  With my experience, one of the
    benefit was to remove jitter of video application with backgroud memory
    pressure.  It would be effect of efficient memory usage by compression
    but more issue is whether swap is there or not in the system.  Recent
    mobile platforms have used JAVA so there are many anonymous pages.  But
    embedded system normally are reluctant to use eMMC or SDCard as swap
    because there is wear-leveling and latency issues so if we do not use
    swap, it means we can't reclaim anoymous pages and at last, we could
    encounter OOM kill.  :(
    
    Although we have real storage as swap, it was a problem, too.  Because
    it sometime ends up making system very unresponsible caused by slow swap
    storage performance.
    
    Quote from Luigi on Google
     "Since Chrome OS was mentioned: the main reason why we don't use swap
      to a disk (rotating or SSD) is because it doesn't degrade gracefully
      and leads to a bad interactive experience.  Generally we prefer to
      manage RAM at a higher level, by transparently killing and restarting
      processes.  But we noticed that zram is fast enough to be competitive
      with the latter, and it lets us make more efficient use of the
      available RAM.  " and he announced.
    http://www.spinics.net/lists/linux-mm/msg57717.html
    
    Other uses case is to use zram for block device.  Zram is block device
    so anyone can format the block device and mount on it so some guys on
    the internet start zram as /var/tmp.
    http://forums.gentoo.org/viewtopic-t-838198-start-0.html
    
    
    
    Let's promote zram and enhance/maintain it instead of removing.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Reviewed-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Acked-by: default avatarNitin Gupta <ngupta@vflare.org>
    Acked-by: default avatarPekka Enberg <penberg@kernel.org>
    Cc: Bob Liu <bob.liu@oracle.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Luigi Semenzato <semenzato@google.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Seth Jennings <sjenning@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit cd67e10a)
    
    Change-Id: Ic5311ef825799d48c52fe9ea9e96b8277e7001fb
    
    zram: remove old private project comment
    
    Remove the old private compcache project address so upcoming patches
    should be sent to LKML because we Linux kernel community will take care.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 49061236)
    
    zram: add copyright
    
    Add my copyright to the zram source code which I maintain.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 7bfb3de8)
    
    zram: fix race between reset and flushing pending work
    
    Dan and Sergey reported that there is a racy between reset and flushing
    of pending work so that it could make oops by freeing zram->meta in
    reset while zram_slot_free can access zram->meta if new request is
    adding during the race window.
    
    This patch moves flush after taking init_lock so it prevents new request
    so that it closes the race.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit da4a0412)
    
    zram: delay pending free request in read path
    
    Sergey reported we don't need to handle pending free request every I/O
    so that this patch removes it in read path while we remain it in write
    path.
    
    Let's consider below example.
    
    Swap subsystem ask to zram "A" block free by swap_slot_free_notify but
    zram had been pended it without real freeing.  Swap subsystem allocates
    "A" block for new data but request pended for a long time just handled
    and zram blindly free new data on the "A" block.  :(
    
    That's why we couldn't remove handle pending free request right before
    zram-write.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Reported-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 9b353db1)
    
    zram: remove unnecessary free
    
    Commit a0c516cb ("zram: don't grab mutex in zram_slot_free_noity")
    introduced pending zram slot free in zram's write path in case of
    missing slot free by memory allocation failure in zram_slot_free_notify
    but it is not necessary because we have already freed the slot right
    before overwriting.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 874e3cdd)
    
    zram: use atomic operation for stat
    
    Some of fields in zram->stats are protected by zram->lock which is
    rather coarse-grained so let's use atomic operation without explict
    locking.
    
    This patch is ready for removing dependency of zram->lock in read path
    which is very coarse-grained rw_semaphore.  Of course, this patch adds
    new atomic operation so it might make slow but my 12CPU test couldn't
    spot any regression.  All gain/lose is marginal within stddev.
    
      iozone -t -T -l 12 -u 12 -r 16K -s 60M -I +Z -V 0
    
      ==Initial write                ==Initial write
      records: 50                    records: 50
      avg:  412875.17                avg:  415638.23
      std:   38543.12 (9.34%)        std:   36601.11 (8.81%)
      max:  521262.03                max:  502976.72
      min:  343263.13                min:  351389.12
      ==Rewrite                      ==Rewrite
      records: 50                    records: 50
      avg:  416640.34                avg:  397914.33
      std:   60798.92 (14.59%)       std:   46150.42 (11.60%)
      max:  543057.07                max:  522669.17
      min:  304071.67                min:  316588.77
      ==Read                         ==Read
      records: 50                    records: 50
      avg: 4147338.63                avg: 4070736.51
      std:  179333.25 (4.32%)        std:  223499.89 (5.49%)
      max: 4459295.28                max: 4539514.44
      min: 3753057.53                min: 3444686.31
      ==Re-read                      ==Re-read
      records: 50                    records: 50
      avg: 4096706.71                avg: 4117218.57
      std:  229735.04 (5.61%)        std:  171676.25 (4.17%)
      max: 4430012.09                max: 4459263.94
      min: 2987217.80                min: 3666904.28
      ==Reverse Read                 ==Reverse Read
      records: 50                    records: 50
      avg: 4062763.83                avg: 4078508.32
      std:  186208.46 (4.58%)        std:  172684.34 (4.23%)
      max: 4401358.78                max: 4424757.22
      min: 3381625.00                min: 3679359.94
      ==Stride read                  ==Stride read
      records: 50                    records: 50
      avg: 4094933.49                avg: 4082170.22
      std:  185710.52 (4.54%)        std:  196346.68 (4.81%)
      max: 4478241.25                max: 4460060.97
      min: 3732593.23                min: 3584125.78
      ==Random read                  ==Random read
      records: 50                    records: 50
      avg: 4031070.04                avg: 4074847.49
      std:  192065.51 (4.76%)        std:  206911.33 (5.08%)
      max: 4356931.16                max: 4399442.56
      min: 3481619.62                min: 3548372.44
      ==Mixed workload               ==Mixed workload
      records: 50                    records: 50
      avg:  149925.73                avg:  149675.54
      std:    7701.26 (5.14%)        std:    6902.09 (4.61%)
      max:  191301.56                max:  175162.05
      min:  133566.28                min:  137762.87
      ==Random write                 ==Random write
      records: 50                    records: 50
      avg:  404050.11                avg:  393021.47
      std:   58887.57 (14.57%)       std:   42813.70 (10.89%)
      max:  601798.09                max:  524533.43
      min:  325176.99                min:  313255.34
      ==Pwrite                       ==Pwrite
      records: 50                    records: 50
      avg:  411217.70                avg:  411237.96
      std:   43114.99 (10.48%)       std:   33136.29 (8.06%)
      max:  530766.79                max:  471899.76
      min:  320786.84                min:  317906.94
      ==Pread                        ==Pread
      records: 50                    records: 50
      avg: 4154908.65                avg: 4087121.92
      std:  151272.08 (3.64%)        std:  219505.04 (5.37%)
      max: 4459478.12                max: 4435857.38
      min: 3730512.41                min: 3101101.67
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit deb0bdeb)
    
    zram: introduce zram->tb_lock
    
    Currently, the zram table is protected by zram->lock but it's rather
    coarse-grained lock and it makes hard for scalibility.
    
    Let's use own rwlock instead of depending on zram->lock.  This patch
    adds new locking so obviously, it would make slow but this patch is just
    prepartion for removing coarse-grained rw_semaphore(ie, zram->lock)
    which is hurdle about zram scalability.
    
    Final patch in this patchset series will remove the lock from read-path
    and change rw_semaphore with mutex in write path.  With bonus, we could
    drop pending slot free mess in next patch.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 92967471)
    
    zram: remove workqueue for freeing removed pending slot
    
    Commit a0c516cb ("zram: don't grab mutex in zram_slot_free_noity")
    introduced free request pending code to avoid scheduling by mutex under
    spinlock and it was a mess which made code lenghty and increased
    overhead.
    
    Now, we don't need zram->lock any more to free slot so this patch
    reverts it and then, tb_lock should protect it.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit f614a9f4)
    
    zram: remove zram->lock in read path and change it with mutex
    
    Finally, we separated zram->lock dependency from 32bit stat/ table
    handling so there is no reason to use rw_semaphore between read and
    write path so this patch removes the lock from read path totally and
    changes rw_semaphore with mutex.  So, we could do
    
    old:
    
      read-read: OK
      read-write: NO
      write-write: NO
    
    Now:
    
      read-read: OK
      read-write: OK
      write-write: NO
    
    The below data proves mixed workload performs well 11 times and there is
    also enhance on write-write path because current rw-semaphore doesn't
    support SPIN_ON_OWNER.  It's side effect but anyway good thing for us.
    
    Write-related tests perform better (from 61% to 1058%) but read path has
    good/bad(from -2.22% to 1.45%) but they are all marginal within stddev.
    
      CPU 12
      iozone -t -T -l 12 -u 12 -r 16K -s 60M -I +Z -V 0
    
      ==Initial write                ==Initial write
      records: 10                    records: 10
      avg:  516189.16                avg:  839907.96
      std:   22486.53 (4.36%)        std:   47902.17 (5.70%)
      max:  546970.60                max:  909910.35
      min:  481131.54                min:  751148.38
      ==Rewrite                      ==Rewrite
      records: 10                    records: 10
      avg:  509527.98                avg: 1050156.37
      std:   45799.94 (8.99%)        std:   40695.44 (3.88%)
      max:  611574.27                max: 1111929.26
      min:  443679.95                min:  980409.62
      ==Read                         ==Read
      records: 10                    records: 10
      avg: 4408624.17                avg: 4472546.76
      std:  281152.61 (6.38%)        std:  163662.78 (3.66%)
      max: 4867888.66                max: 4727351.03
      min: 4058347.69                min: 4126520.88
      ==Re-read                      ==Re-read
      records: 10                    records: 10
      avg: 4462147.53                avg: 4363257.75
      std:  283546.11 (6.35%)        std:  247292.63 (5.67%)
      max: 4912894.44                max: 4677241.75
      min: 4131386.50                min: 4035235.84
      ==Reverse Read                 ==Reverse Read
      records: 10                    records: 10
      avg: 4565865.97                avg: 4485818.08
      std:  313395.63 (6.86%)        std:  248470.10 (5.54%)
      max: 5232749.16                max: 4789749.94
      min: 4185809.62                min: 3963081.34
      ==Stride read                  ==Stride read
      records: 10                    records: 10
      avg: 4515981.80                avg: 4418806.01
      std:  211192.32 (4.68%)        std:  212837.97 (4.82%)
      max: 4889287.28                max: 4686967.22
      min: 4210362.00                min: 4083041.84
      ==Random read                  ==Random read
      records: 10                    records: 10
      avg: 4410525.23                avg: 4387093.18
      std:  236693.22 (5.37%)        std:  235285.23 (5.36%)
      max: 4713698.47                max: 4669760.62
      min: 4057163.62                min: 3952002.16
      ==Mixed workload               ==Mixed workload
      records: 10                    records: 10
      avg:  243234.25                avg: 2818677.27
      std:   28505.07 (11.72%)       std:  195569.70 (6.94%)
      max:  288905.23                max: 3126478.11
      min:  212473.16                min: 2484150.69
      ==Random write                 ==Random write
      records: 10                    records: 10
      avg:  555887.07                avg: 1053057.79
      std:   70841.98 (12.74%)       std:   35195.36 (3.34%)
      max:  683188.28                max: 1096125.73
      min:  437299.57                min:  992481.93
      ==Pwrite                       ==Pwrite
      records: 10                    records: 10
      avg:  501745.93                avg:  810363.09
      std:   16373.54 (3.26%)        std:   19245.01 (2.37%)
      max:  518724.52                max:  833359.70
      min:  464208.73                min:  765501.87
      ==Pread                        ==Pread
      records: 10                    records: 10
      avg: 4539894.60                avg: 4457680.58
      std:  197094.66 (4.34%)        std:  188965.60 (4.24%)
      max: 4877170.38                max: 4689905.53
      min: 4226326.03                min: 4095739.72
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Tested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit e46e3315)
    
    zram: avoid null access when fail to alloc meta
    
    zram_meta_alloc could fail so caller should check it.  Otherwise, your
    system will hang.
    
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit db5d711e)
    
    zram: drop `init_done' struct zram member
    
    Introduce init_done() helper function which allows us to drop `init_done'
    struct zram member.  init_done() uses the fact that ->init_done == 1
    equals to ->meta != NULL.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit be2d1d56)
    
    zram: do not pass rw argument to __zram_make_request()
    
    Do not pass rw argument down the __zram_make_request() -> zram_bvec_rw()
    chain, decode it in zram_bvec_rw() instead.  Besides, this is the place
    where we distinguish READ and WRITE bio data directions, so account zram
    RW stats here, instead of __zram_make_request().  This also allows to
    account a real number of zram READ/WRITE operations, not just requests
    (single RW request may cause a number of zram RW ops with separate
    locking, compression/decompression, etc).
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit be257c61)
    
    zram: remove good and bad compress stats
    
    Remove `good' and `bad' compressed sub-requests stats.  RW request may
    cause a number of RW sub-requests.  zram used to account `good' compressed
    sub-queries (with compressed size less than 50% of original size), `bad'
    compressed sub-queries (with compressed size greater that 75% of original
    size), leaving sub-requests with compression size between 50% and 75% of
    original size not accounted and not reported.  zram already accounts each
    sub-request's compression size so we can calculate real device compression
    ratio.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit b7cccf8b)
    
    zram: use atomic64_t for all zram stats
    
    This is a preparation patch for stats code duplication removal.
    
    1) use atomic64_t for `pages_zero' and `pages_stored' zram stats.
    
    2) `compr_size' and `pages_zero' struct zram_stats members did not
       follow the existing device attr naming scheme: zram_stats.ATTR has
       ATTR_show() function.  rename them:
    
       -- compr_size -> compr_data_size
       -- pages_zero -> zero_pages
    
    Minchan Kim's note:
     If we really have trouble with atomic stat operation, we could
     change it with percpu_counter so that it could solve atomic overhead and
     unnecessary memory space by introducing unsigned long instead of 64bit
     atomic_t.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 90a7806e)
    
    zram: remove zram stats code duplication
    
    Introduce ZRAM_ATTR_RO macro that generates device_attribute and default
    ATTR show() function for existing atomic64_t zram stats.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit a68eb3b6)
    
    zram: report failed read and write stats
    
    zram accounted but did not report numbers of failed read and write
    queries.  make these stats available as failed_reads and failed_writes
    attrs.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 64447249)
    
    zram: drop not used table `count' member
    
    struct table `count' member is not used.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 59fc86a4)
    
    zram: move zram size warning to documentation
    
    Move zram warning about disksize and size of memory correlation to zram
    documentation.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit e64cd51d)
    
    zram: delete zram_init_device()
    
    allocate new `zram_meta' in disksize_store() only for uninitialised zram
    device, saving a number of allocations and deallocations in case if
    disksize_store() was called on currently used device.  at the same time
    zram_meta stack variable is not necessary, because we can set ->meta
    directly.  there is also no need in setting QUEUE_FLAG_NONROT queue on
    every disksize_store(), set it once during device creation.
    
    [minchan@kernel.org: handle zram->meta alloc fail case]
    [minchan@kernel.org: prevent lockdep spew of init_lock]
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Sasha Levin <sasha.levin@oracle.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    (cherry picked from commit b67d1ec1)
    
    zram: introduce compressing backend abstraction
    
    ZRAM performs direct LZO compression algorithm calls, making it the one
    and only option.  While LZO is generally performs well, LZ4 algorithm
    tends to have a faster decompression (see http://code.google.com/p/lz4/
    
    
    for full report)
    
    	Name            Ratio  C.speed D.speed
    	                        MB/s    MB/s
    	LZ4 (r101)      2.084    422    1820
    	LZO 2.06        2.106    414     600
    
    Thus, users who have mostly read (decompress) usage scenarious or mixed
    workflow (writes with relatively high read ops number) will benefit from
    using LZ4 compression backend.
    
    Introduce compressing backend abstraction zcomp in order to support
    multiple compression algorithms with the following set of operations:
    
            .create
            .destroy
            .compress
            .decompress
    
    Schematically zram write() usually contains the following steps:
    0) preparation (decompression of partioal IO, etc.)
    1) lock buffer_lock mutex (protects meta compress buffers)
    2) compress (using meta compress buffers)
    3) alloc and map zs_pool object
    4) copy compressed data (from meta compress buffers) to object allocated by 3)
    5) free previous pool page, assign a new one
    6) unlock buffer_lock mutex
    
    As we can see, compressing buffers must remain untouched from 1) to 4),
    because, otherwise, concurrent write() can overwrite data.  At the same
    time, zram_meta must be aware of a) specific compression algorithm memory
    requirements and b) necessary locking to protect compression buffers.  To
    remove requirement a) new struct zcomp_strm introduced, which contains a
    compress/decompress `buffer' and compression algorithm `private' part.
    While struct zcomp implements zcomp_strm stream handling and locking and
    removes requirement b) from zram meta.  zcomp ->create() and ->destroy(),
    respectively, allocate and deallocate algorithm specific zcomp_strm
    `private' part.
    
    Every zcomp has zcomp stream and mutex to protect its compression stream.
    Stream usage semantics remains the same -- only one write can hold stream
    lock and use its buffers.  zcomp_strm_find() turns caller into exclusive
    user of a stream (holding stream mutex until zram release stream), and
    zcomp_strm_release() makes zcomp stream available (unlock the stream
    mutex).  Hence no concurrent write (compression) operations possible at
    the moment.
    
    iozone -t 3 -R -r 16K -s 60M -I +Z
    
           test            base           patched
    --------------------------------------------------
      Initial write      597992.91       591660.58
            Rewrite      609674.34       616054.97
               Read     2404771.75      2452909.12
            Re-read     2459216.81      2470074.44
       Reverse Read     1652769.66      1589128.66
        Stride read     2202441.81      2202173.31
        Random read     2236311.47      2276565.31
     Mixed workload     1423760.41      1709760.06
       Random write      579584.08       615933.86
             Pwrite      597550.02       594933.70
              Pread     1703672.53      1718126.72
             Fwrite     1330497.06      1461054.00
              Fread     3922851.00      3957242.62
    
    Usage examples:
    
    	comp = zcomp_create(NAME) /* NAME e.g. "lzo" */
    
    which initialises compressing backend if requested algorithm is supported.
    
    Compress:
    	zstrm = zcomp_strm_find(comp)
    	zcomp_compress(comp, zstrm, src, &dst_len)
    	[..] /* copy compressed data */
    	zcomp_strm_release(comp, zstrm)
    
    Decompress:
    	zcomp_decompress(comp, src, src_len, dst);
    
    Free compessing backend and its zcomp stream:
    	zcomp_destroy(comp)
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit e7e1ef43)
    
    zram: use zcomp compressing backends
    
    Do not perform direct LZO compress/decompress calls, initialise
    and use zcomp LZO backend (single compression stream) instead.
    
    [akpm@linux-foundation.org: resolve conflicts with zram-delete-zram_init_device-fix.patch]
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    (cherry picked from commit b7ca232e)
    
    zram: factor out single stream compression
    
    This is preparation patch to add multi stream support to zcomp.
    
    Introduce struct zcomp_strm_single and a set of functions to manage
    zcomp_strm stream access.  zcomp_strm_single implements single compession
    stream, same way as current zcomp implementation.  This moves zcomp_strm
    stream control and locking from zcomp, so compressing backend zcomp is not
    aware of required locking.
    
    Single and multi streams require different locking schemes.  Minchan Kim
    reported that spinlock-based locking scheme (which is used in multi stream
    implementation) has demonstrated a severe perfomance regression for single
    compression stream case, comparing to mutex-based.  see
    https://lkml.org/lkml/2014/2/18/16
    
    
    
    The following set of functions added:
    - zcomp_strm_single_find()/zcomp_strm_single_release()
      find and release a compression stream, implement required locking
    - zcomp_strm_single_create()/zcomp_strm_single_destroy()
      create and destroy zcomp_strm_single
    
    New ->strm_find() and ->strm_release() callbacks added to zcomp, which are
    set to zcomp_strm_single_find() and zcomp_strm_single_release() during
    initialisation.  Instead of direct locking and zcomp_strm access from
    zcomp_strm_find() and zcomp_strm_release(), zcomp now calls ->strm_find()
    and ->strm_release() correspondingly.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 9cc97529)
    
    zram: document failed_reads, failed_writes stats
    
    Document `failed_reads' and `failed_writes' device attributes.
    Remove info about `discard' - there is no such zram attr.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 8dd1d324)
    
    zram: add multi stream functionality
    
    Existing zram (zcomp) implementation has only one compression stream
    (buffer and algorithm private part), so in order to prevent data
    corruption only one write (compress operation) can use this compression
    stream, forcing all concurrent write operations to wait for stream lock
    to be released.  This patch changes zcomp to keep a compression streams
    list of user-defined size (via sysfs device attr).  Each write operation
    still exclusively holds compression stream, the difference is that we
    can have N write operations (depending on size of streams list)
    executing in parallel.  See TEST section later in commit message for
    performance data.
    
    Introduce struct zcomp_strm_multi and a set of functions to manage
    zcomp_strm stream access.  zcomp_strm_multi has a list of idle
    zcomp_strm structs, spinlock to protect idle list and wait queue, making
    it possible to perform parallel compressions.
    
    The following set of functions added:
    - zcomp_strm_multi_find()/zcomp_strm_multi_release()
      find and release a compression stream, implement required locking
    - zcomp_strm_multi_create()/zcomp_strm_multi_destroy()
      create and destroy zcomp_strm_multi
    
    zcomp ->strm_find() and ->strm_release() callbacks are set during
    initialisation to zcomp_strm_multi_find()/zcomp_strm_multi_release()
    correspondingly.
    
    Each time zcomp issues a zcomp_strm_multi_find() call, the following set
    of operations performed:
    
    - spin lock strm_lock
    - if idle list is not empty, remove zcomp_strm from idle list, spin
      unlock and return zcomp stream pointer to caller
    - if idle list is empty, current adds itself to wait queue. it will be
      awaken by zcomp_strm_multi_release() caller.
    
    zcomp_strm_multi_release():
    - spin lock strm_lock
    - add zcomp stream to idle list
    - spin unlock, wake up sleeper
    
    Minchan Kim reported that spinlock-based locking scheme has demonstrated
    a severe perfomance regression for single compression stream case,
    comparing to mutex-based (see https://lkml.org/lkml/2014/2/18/16
    
    )
    
    base                      spinlock                    mutex
    
    ==Initial write           ==Initial write             ==Initial  write
    records:  5               records:  5                 records:   5
    avg:      1642424.35      avg:      699610.40         avg:       1655583.71
    std:      39890.95(2.43%) std:      232014.19(33.16%) std:       52293.96
    max:      1690170.94      max:      1163473.45        max:       1697164.75
    min:      1568669.52      min:      573429.88         min:       1553410.23
    ==Rewrite                 ==Rewrite                   ==Rewrite
    records:  5               records:  5                 records:   5
    avg:      1611775.39      avg:      501406.64         avg:       1684419.11
    std:      17144.58(1.06%) std:      15354.41(3.06%)   std:       18367.42
    max:      1641800.95      max:      531356.78         max:       1706445.84
    min:      1593515.27      min:      488817.78         min:       1655335.73
    
    When only one compression stream available, mutex with spin on owner
    tends to perform much better than frequent wait_event()/wake_up().  This
    is why single stream implemented as a special case with mutex locking.
    
    Introduce and document zram device attribute max_comp_streams.  This
    attr shows and stores current zcomp's max number of zcomp streams
    (max_strm).  Extend zcomp's zcomp_create() with `max_strm' parameter.
    `max_strm' limits the number of zcomp_strm structs in compression
    backend's idle list (max_comp_streams).
    
    max_comp_streams used during initialisation as follows:
    -- passing to zcomp_create() max_strm equals to 1 will initialise zcomp
    using single compression stream zcomp_strm_single (mutex-based locking).
    -- passing to zcomp_create() max_strm greater than 1 will initialise zcomp
    using multi compression stream zcomp_strm_multi (spinlock-based locking).
    
    default max_comp_streams value is 1, meaning that zram with single stream
    will be initialised.
    
    Later patch will introduce configuration knob to change max_comp_streams
    on already initialised and used zcomp.
    
    TEST
    iozone -t 3 -R -r 16K -s 60M -I +Z
    
           test           base       1 strm (mutex)     3 strm (spinlock)
    -----------------------------------------------------------------------
     Initial write      589286.78       583518.39          718011.05
           Rewrite      604837.97       596776.38         1515125.72
      Random write      584120.11       595714.58         1388850.25
            Pwrite      535731.17       541117.38          739295.27
            Fwrite     1418083.88      1478612.72         1484927.06
    
    Usage example:
    set max_comp_streams to 4
            echo 4 > /sys/block/zram0/max_comp_streams
    
    show current max_comp_streams (default value is 1).
            cat /sys/block/zram0/max_comp_streams
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit beca3ec7)
    
    zram: add set_max_streams knob
    
    This patch allows to change max_comp_streams on initialised zcomp.
    
    Introduce zcomp set_max_streams() knob, zcomp_strm_multi_set_max_streams()
    and zcomp_strm_single_set_max_streams() callbacks to change streams limit
    for zcomp_strm_multi and zcomp_strm_single, accordingly.  set_max_streams
    for single steam zcomp does nothing.
    
    If user has lowered the limit, then zcomp_strm_multi_set_max_streams()
    attempts to immediately free extra streams (as much as it can, depending
    on idle streams availability).
    
    Note, this patch does not allow to change stream 'policy' from single to
    multi stream (or vice versa) on already initialised compression backend.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit fe8eb122)
    
    zram: make compression algorithm selection possible
    
    Add and document `comp_algorithm' device attribute.  This attribute allows
    to show supported compression and currently selected compression
    algorithms:
    
    	cat /sys/block/zram0/comp_algorithm
    	[lzo] lz4
    
    and change selected compression algorithm:
    	echo lzo > /sys/block/zram0/comp_algorithm
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit e46b8a03)
    
    zram: add lz4 algorithm backend
    
    Introduce LZ4 compression backend and make it available for selection.
    LZ4 support is optional and requires user to set ZRAM_LZ4_COMPRESS config
    option.  The default compression backend is LZO.
    
    TEST
    
    (x86_64, core i5, 2 cores + 2 hyperthreading, zram disk size 1G,
    ext4 file system, 3 compression streams)
    
    iozone -t 3 -R -r 16K -s 60M -I +Z
    
           Test           LZO           LZ4
    ----------------------------------------------
      Initial write   1642744.62    1317005.09
            Rewrite   2498980.88    1800645.16
               Read   3957026.38    5877043.75
            Re-read   3950997.38    5861847.00
       Reverse Read   2937114.56    5047384.00
        Stride read   2948163.19    4929587.38
        Random read   3292692.69    4880793.62
     Mixed workload   1545602.62    3502940.38
       Random write   2448039.75    1758786.25
             Pwrite   1670051.03    1338329.69
              Pread   2530682.00    5097177.62
             Fwrite   3232085.62    3275942.56
              Fread   6306880.25    6645271.12
    
    So on my system LZ4 is slower in write-only tests, while it performs
    better in read-only and mixed (reads + writes) tests.
    
    Official LZ4 benchmarks available here http://code.google.com/p/lz4/
    
    
    (linux kernel uses revision r90).
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 6e76668e)
    
    zram: move comp allocation out of init_lock
    
    While fixing lockdep spew of ->init_lock reported by Sasha Levin [1],
    Minchan Kim noted [2] that it's better to move compression backend
    allocation (using GPF_KERNEL) out of the ->init_lock lock, same way as
    with zram_meta_alloc(), in order to prevent the same lockdep spew.
    
    [1] https://lkml.org/lkml/2014/2/27/337
    [2] https://lkml.org/lkml/2014/3/3/32
    
    
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reported-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Sasha Levin <sasha.levin@oracle.com>
    Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit d61f98c7)
    
    zram: return error-valued pointer from zcomp_create()
    
    Instead of returning just NULL, return ERR_PTR from zcomp_create() if
    compressing backend creation has failed.  ERR_PTR(-EINVAL) for unsupported
    compression algorithm request, ERR_PTR(-ENOMEM) for allocation (zcomp or
    compression stream) error.
    
    Perform IS_ERR() check of returned from zcomp_create() value in
    disksize_store() and set return code to PTR_ERR().
    
    Change suggested by Jerome Marchand.
    
    [akpm@linux-foundation.org: clean up error recovery flow]
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reported-by: default avatarJerome Marchand <jmarchan@redhat.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    (cherry picked from commit fcfa8d95)
    
    zram: propagate error to user
    
    When we initialized zcomp with single, we couldn't change
    max_comp_streams without zram reset but current interface doesn't show
    any error to user and even it changes max_comp_streams's value without
    any effect so it would make user very confusing.
    
    This patch prevents max_comp_streams's change when zcomp was initialized
    as single zcomp and emit the error to user(ex, echo).
    
    [akpm@linux-foundation.org: don't return with the lock held, per Sergey]
    [fengguang.wu@intel.com: fix coccinelle warnings]
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Acked-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: default avatarFengguang Wu <fengguang.wu@intel.com>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    (cherry picked from commit 60a726e3)
    
    zram: use scnprintf() in attrs show() methods
    
    sysfs.txt documentation lists the following requirements:
    
     - The buffer will always be PAGE_SIZE bytes in length. On i386, this
       is 4096.
    
     - show() methods should return the number of bytes printed into the
       buffer. This is the return value of scnprintf().
    
     - show() should always use scnprintf().
    
    Use scnprintf() in show() functions.
    
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit 56b4e8cb)
    
    zram: support REQ_DISCARD
    
    zram is ram based block device and can be used by backend of filesystem.
    When filesystem deletes a file, it normally doesn't do anything on data
    block of that file.  It just marks on metadata of that file.  This
    behavior has no problem on disk based block device, but has problems on
    ram based block device, since we can't free memory used for data block.
    To overcome this disadvantage, there is REQ_DISCARD functionality.  If
    block device support REQ_DISCARD and filesystem is mounted with discard
    option, filesystem sends REQ_DISCARD to block device whenever some data
    blocks are discarded.  All we have to do is to handle this request.
    
    This patch implements to flag up QUEUE_FLAG_DISCARD and handle this
    REQ_DISCARD request.  With it, we can free memory used by zram if it isn't
    used.
    
    [akpm@linux-foundation.org: tweak comments]
    Signed-off-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    
    (cherry picked from commit f4659d8e)
    d330c0f6
    History
    Name Last commit Last update
    ..