Skip to content
Snippets Groups Projects
  1. Jan 26, 2022
    • David Decotigny's avatar
      mtd_blkdevs: avoid soft lockups with some mtd/spi devices · ca6263a0
      David Decotigny authored
      
      With some spi devices, the heavy cpu usage due to polling the spi
      registers may lead to netdev timeouts, RCU complaints, etc. This can
      be acute in the absence of CONFIG_PREEMPT. This patch allows to give
      enough breathing room to avoid those incorrectly detected netdev
      timeouts for example.
      
      Example splat on 5.10.92:
      [  828.399306] rcu: INFO: rcu_sched self-detected stall on CPU
      ...
      [  828.419245] Task dump for CPU 1:
      [  828.422465] task:kworker/1:1H    state:R  running task on cpu   1   stack:    0 pid:   76 ppid:     2 flags:0x0000002a
      [  828.433132] Workqueue: kblockd blk_mq_run_work_fn
      [  828.437820] Call trace:
      ...
      [  828.512267]  spi_mem_exec_op+0x4d0/0xde0
      [  828.516184]  spi_mem_dirmap_read+0x180/0x39c
      [  828.520443]  spi_nor_read_data+0x428/0x7e8
      [  828.524523]  spi_nor_read+0x154/0x214
      [  828.528172]  mtd_read_oob+0x440/0x714
      [  828.531815]  mtd_read+0xac/0x120
      [  828.535030]  mtdblock_readsect+0x178/0x230
      [  828.539102]  mtd_blktrans_work+0x9fc/0xf28
      [  828.543177]  mtd_queue_rq+0x1ac/0x2e4
      [  828.546827]  blk_mq_dispatch_rq_list+0x2cc/0xa44
      [  828.551419]  blk_mq_do_dispatch_sched+0xb0/0x7cc
      [  828.556010]  __blk_mq_sched_dispatch_requests+0x350/0x494
      [  828.561372]  blk_mq_sched_dispatch_requests+0xac/0xe4
      [  828.566387]  __blk_mq_run_hw_queue+0x130/0x254
      [  828.570806]  blk_mq_run_work_fn+0x50/0x60
      [  828.574814]  process_one_work+0x578/0xf1c
      [  828.578814]  worker_thread+0x5dc/0xea0
      [  828.582547]  kthread+0x270/0x2d4
      [  828.585765]  ret_from_fork+0x10/0x30
      
      Signed-off-by: default avatarDavid Decotigny <ddecotig@google.com>
      Reviewed-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
      Link: https://lore.kernel.org/linux-mtd/20220126101120.676021-1-decot+git@google.com
      ca6263a0
  2. Dec 12, 2021
  3. Dec 10, 2021
  4. Dec 06, 2021
  5. Nov 29, 2021
  6. Oct 21, 2021
  7. Aug 23, 2021
  8. Aug 06, 2021
  9. Jul 15, 2021
  10. Jun 16, 2021
  11. Jun 11, 2021
  12. Nov 16, 2020
  13. May 24, 2019
  14. Oct 16, 2018
    • Jens Axboe's avatar
      mtd_blkdevs: convert to blk-mq · 891b7c5f
      Jens Axboe authored
      
      Straight forward conversion, using an internal list to enable the
      driver to pull requests at will.
      
      Dynamically allocate the tag set to avoid having to pull in the
      block headers for blktrans.h, since various mtd drivers use
      block conflicting names for defines and functions.
      
      Cc: David Woodhouse <dwmw2@infradead.org>
      Cc: linux-mtd@lists.infradead.org
      Tested-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      891b7c5f
  15. Sep 28, 2018
  16. May 11, 2018
  17. Mar 08, 2018
  18. Aug 12, 2017
  19. Jun 27, 2017
  20. Jun 09, 2017
    • Christoph Hellwig's avatar
      block: introduce new block status code type · 2a842aca
      Christoph Hellwig authored
      
      Currently we use nornal Linux errno values in the block layer, and while
      we accept any error a few have overloaded magic meanings.  This patch
      instead introduces a new  blk_status_t value that holds block layer specific
      status codes and explicitly explains their meaning.  Helpers to convert from
      and to the previous special meanings are provided for now, but I suspect
      we want to get rid of them in the long run - those drivers that have a
      errno input (e.g. networking) usually get errnos that don't know about
      the special block layer overloads, and similarly returning them to userspace
      will usually return somethings that strictly speaking isn't correct
      for file system operations, but that's left as an exercise for later.
      
      For now the set of errors is a very limited set that closely corresponds
      to the previous overloaded errno values, but there is some low hanging
      fruite to improve it.
      
      blk_status_t (ab)uses the sparse __bitwise annotations to allow for sparse
      typechecking, so that we can easily catch places passing the wrong values.
      
      Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarJens Axboe <axboe@fb.com>
      2a842aca
  21. Jan 31, 2017
    • Christoph Hellwig's avatar
      block: fold cmd_type into the REQ_OP_ space · aebf526b
      Christoph Hellwig authored
      
      Instead of keeping two levels of indirection for requests types, fold it
      all into the operations.  The little caveat here is that previously
      cmd_type only applied to struct request, while the request and bio op
      fields were set to plain REQ_OP_READ/WRITE even for passthrough
      operations.
      
      Instead this patch adds new REQ_OP_* for SCSI passthrough and driver
      private requests, althought it has to add two for each so that we
      can communicate the data in/out nature of the request.
      
      Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarJens Axboe <axboe@fb.com>
      aebf526b
  22. Dec 24, 2016
  23. Jun 27, 2016
    • Dan Williams's avatar
      block: convert to device_add_disk() · 0d52c756
      Dan Williams authored
      
      For block drivers that specify a parent device, convert them to use
      device_add_disk().
      
      This conversion was done with the following semantic patch:
      
          @@
          struct gendisk *disk;
          expression E;
          @@
      
          - disk->driverfs_dev = E;
          ...
          - add_disk(disk);
          + device_add_disk(E, disk);
      
          @@
          struct gendisk *disk;
          expression E1, E2;
          @@
      
          - disk->driverfs_dev = E1;
          ...
          E2 = disk;
          ...
          - add_disk(E2);
          + device_add_disk(E1, E2);
      
      ...plus some manual fixups for a few missed conversions.
      
      Cc: Jens Axboe <axboe@fb.com>
      Cc: Keith Busch <keith.busch@intel.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Cc: David S. Miller <davem@davemloft.net>
      Cc: James Bottomley <James.Bottomley@hansenpartnership.com>
      Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
      Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      Cc: Martin K. Petersen <martin.petersen@oracle.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
      Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
      0d52c756
  24. Jun 07, 2016
  25. Apr 12, 2016
  26. Oct 31, 2015
    • Brian Norris's avatar
      mtd: blkdevs: fix potential deadlock + lockdep warnings · f3c63795
      Brian Norris authored
      
      Commit 073db4a5 ("mtd: fix: avoid race condition when accessing
      mtd->usecount") fixed a race condition but due to poor ordering of the
      mutex acquisition, introduced a potential deadlock.
      
      The deadlock can occur, for example, when rmmod'ing the m25p80 module, which
      will delete one or more MTDs, along with any corresponding mtdblock
      devices. This could potentially race with an acquisition of the block
      device as follows.
      
       -> blktrans_open()
          ->  mutex_lock(&dev->lock);
          ->  mutex_lock(&mtd_table_mutex);
      
       -> del_mtd_device()
          ->  mutex_lock(&mtd_table_mutex);
          ->  blktrans_notify_remove() -> del_mtd_blktrans_dev()
             ->  mutex_lock(&dev->lock);
      
      This is a classic (potential) ABBA deadlock, which can be fixed by
      making the A->B ordering consistent everywhere. There was no real
      purpose to the ordering in the original patch, AFAIR, so this shouldn't
      be a problem. This ordering was actually already present in
      del_mtd_blktrans_dev(), for one, where the function tried to ensure that
      its caller already held mtd_table_mutex before it acquired &dev->lock:
      
              if (mutex_trylock(&mtd_table_mutex)) {
                      mutex_unlock(&mtd_table_mutex);
                      BUG();
              }
      
      So, reverse the ordering of acquisition of &dev->lock and &mtd_table_mutex so
      we always acquire mtd_table_mutex first.
      
      Snippets of the lockdep output follow:
      
        # modprobe -r m25p80
        [   53.419251]
        [   53.420838] ======================================================
        [   53.427300] [ INFO: possible circular locking dependency detected ]
        [   53.433865] 4.3.0-rc6 #96 Not tainted
        [   53.437686] -------------------------------------------------------
        [   53.444220] modprobe/372 is trying to acquire lock:
        [   53.449320]  (&new->lock){+.+...}, at: [<c043fe4c>] del_mtd_blktrans_dev+0x80/0xdc
        [   53.457271]
        [   53.457271] but task is already holding lock:
        [   53.463372]  (mtd_table_mutex){+.+.+.}, at: [<c0439994>] del_mtd_device+0x18/0x100
        [   53.471321]
        [   53.471321] which lock already depends on the new lock.
        [   53.471321]
        [   53.479856]
        [   53.479856] the existing dependency chain (in reverse order) is:
        [   53.487660]
        -> #1 (mtd_table_mutex){+.+.+.}:
        [   53.492331]        [<c043fc5c>] blktrans_open+0x34/0x1a4
        [   53.497879]        [<c01afce0>] __blkdev_get+0xc4/0x3b0
        [   53.503364]        [<c01b0bb8>] blkdev_get+0x108/0x320
        [   53.508743]        [<c01713c0>] do_dentry_open+0x218/0x314
        [   53.514496]        [<c0180454>] path_openat+0x4c0/0xf9c
        [   53.519959]        [<c0182044>] do_filp_open+0x5c/0xc0
        [   53.525336]        [<c0172758>] do_sys_open+0xfc/0x1cc
        [   53.530716]        [<c000f740>] ret_fast_syscall+0x0/0x1c
        [   53.536375]
        -> #0 (&new->lock){+.+...}:
        [   53.540587]        [<c063f124>] mutex_lock_nested+0x38/0x3cc
        [   53.546504]        [<c043fe4c>] del_mtd_blktrans_dev+0x80/0xdc
        [   53.552606]        [<c043f164>] blktrans_notify_remove+0x7c/0x84
        [   53.558891]        [<c04399f0>] del_mtd_device+0x74/0x100
        [   53.564544]        [<c043c670>] del_mtd_partitions+0x80/0xc8
        [   53.570451]        [<c0439aa0>] mtd_device_unregister+0x24/0x48
        [   53.576637]        [<c046ce6c>] spi_drv_remove+0x1c/0x34
        [   53.582207]        [<c03de0f0>] __device_release_driver+0x88/0x114
        [   53.588663]        [<c03de19c>] device_release_driver+0x20/0x2c
        [   53.594843]        [<c03dd9e8>] bus_remove_device+0xd8/0x108
        [   53.600748]        [<c03dacc0>] device_del+0x10c/0x210
        [   53.606127]        [<c03dadd0>] device_unregister+0xc/0x20
        [   53.611849]        [<c046d878>] __unregister+0x10/0x20
        [   53.617211]        [<c03da868>] device_for_each_child+0x50/0x7c
        [   53.623387]        [<c046eae8>] spi_unregister_master+0x58/0x8c
        [   53.629578]        [<c03e12f0>] release_nodes+0x15c/0x1c8
        [   53.635223]        [<c03de0f8>] __device_release_driver+0x90/0x114
        [   53.641689]        [<c03de900>] driver_detach+0xb4/0xb8
        [   53.647147]        [<c03ddc78>] bus_remove_driver+0x4c/0xa0
        [   53.652970]        [<c00cab50>] SyS_delete_module+0x11c/0x1e4
        [   53.658976]        [<c000f740>] ret_fast_syscall+0x0/0x1c
        [   53.664621]
        [   53.664621] other info that might help us debug this:
        [   53.664621]
        [   53.672979]  Possible unsafe locking scenario:
        [   53.672979]
        [   53.679169]        CPU0                    CPU1
        [   53.683900]        ----                    ----
        [   53.688633]   lock(mtd_table_mutex);
        [   53.692383]                                lock(&new->lock);
        [   53.698306]                                lock(mtd_table_mutex);
        [   53.704658]   lock(&new->lock);
        [   53.707946]
        [   53.707946]  *** DEADLOCK ***
      
      Fixes: 073db4a5 ("mtd: fix: avoid race condition when accessing mtd->usecount")
      Reported-by: default avatarFelipe Balbi <balbi@ti.com>
      Tested-by: default avatarFelipe Balbi <balbi@ti.com>
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      Cc: <stable@vger.kernel.org>
      f3c63795
  27. Sep 29, 2015
    • Peng Fan's avatar
      mtd: blktrans: fix multiplication overflow · 2ce401d5
      Peng Fan authored
      
      In drivers/mtd/mtd_blkdevs.c:
      406	set_capacity(gd, (new->size * tr->blksize) >> 9);
      The type of new->size is unsigned long and the type of tr->blksize is int,
      the result of 'new->size * tr->blksize' may exceed ULONG_MAX on 32bit
      machines.
      
      I use nand chip MT29F32G08CBADBWP which is 4GB and the parameters passed
      to kernel is 'mtdparts=gpmi-nand:-(user)', the whole nand chip will be
      treated as a 4GB mtd partition. new->size is 0x800000 and tr->blksize is
      0x200, 'new->size * tr->blksize' however is 0. This is what we do not want
      to see.
      
      Using type cast u64 to fix the multiplication overflow issue.
      
      Signed-off-by: default avatarPeng Fan <van.freenix@gmail.com>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      2ce401d5
  28. Aug 25, 2015
  29. Jul 17, 2015
  30. May 21, 2015
  31. May 12, 2015
    • Brian Norris's avatar
      mtd: fix: avoid race condition when accessing mtd->usecount · 073db4a5
      Brian Norris authored
      
      On A MIPS 32-cores machine a BUG_ON was triggered because some acesses to
      mtd->usecount were done without taking mtd_table_mutex.
      kernel: Call Trace:
      kernel: [<ffffffff80401818>] __put_mtd_device+0x20/0x50
      kernel: [<ffffffff804086f4>] blktrans_release+0x8c/0xd8
      kernel: [<ffffffff802577e0>] __blkdev_put+0x1a8/0x200
      kernel: [<ffffffff802579a4>] blkdev_close+0x1c/0x30
      kernel: [<ffffffff8022006c>] __fput+0xac/0x250
      kernel: [<ffffffff80171208>] task_work_run+0xd8/0x120
      kernel: [<ffffffff8012c23c>] work_notifysig+0x10/0x18
      kernel:
      kernel:
              Code: 2442ffff  ac8202d8  000217fe <00020336> dc820128  10400003
                     00000000  0040f809  00000000
      kernel: ---[ end trace 080fbb4579b47a73 ]---
      
      Fixed by taking the mutex in blktrans_open and blktrans_release.
      
      Note that this locking is already suggested in
      include/linux/mtd/blktrans.h:
      
      struct mtd_blktrans_ops {
      ...
      	/* Called with mtd_table_mutex held; no race with add/remove */
      	int (*open)(struct mtd_blktrans_dev *dev);
      	void (*release)(struct mtd_blktrans_dev *dev);
      ...
      };
      
      But we weren't following it.
      
      Originally reported by (and patched by) Zhang and Giuseppe,
      independently. Improved and rewritten.
      
      Cc: stable@vger.kernel.org
      Reported-by: default avatarZhang Xingcai <zhangxingcai@huawei.com>
      Reported-by: default avatarGiuseppe Cantavenera <giuseppe.cantavenera.ext@nokia.com>
      Tested-by: default avatarGiuseppe Cantavenera <giuseppe.cantavenera.ext@nokia.com>
      Acked-by: default avatarAlexander Sverdlin <alexander.sverdlin@nokia.com>
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      073db4a5
Loading