]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Merge tag 'v4.1.12-70#22913653a12' into pmem-4.1-merge
authorDan Duval <dan.duval@oracle.com>
Fri, 23 Dec 2016 18:32:49 +0000 (13:32 -0500)
committerDan Duval <dan.duval@oracle.com>
Fri, 23 Dec 2016 18:32:49 +0000 (13:32 -0500)
OLdev tag v4.1.12-70#22913653a12

Signed-off-by: Dan Duval <dan.duval@oracle.com>
Conflicts:

block/blk-mq-sysfs.c
block/blk-mq.c

Additional edit needed:

fs/xfs/xfs_aops.c

1  2 
arch/sparc/include/asm/pgtable_64.h
block/blk-core.c
block/blk-mq.c
fs/xfs/xfs_aops.c
include/linux/blkdev.h
include/linux/device.h
include/linux/mm.h
mm/migrate.c

Simple merge
index ff273ee5fd8519b443a685a98448eaaa0713259a,68f805a4f1af0ba4aeb6135fd681cc59f07f2483..62d278b9391c91d6e7796f5756afa53adcf28f30
@@@ -662,13 -694,23 +694,24 @@@ struct request_queue *blk_alloc_queue_n
        __set_bit(QUEUE_FLAG_BYPASS, &q->queue_flags);
  
        init_waitqueue_head(&q->mq_freeze_wq);
 +      mutex_init(&q->mq_freeze_lock);
  
-       if (blkcg_init_queue(q))
+       /*
+        * Init percpu_ref in atomic mode so that it's faster to shutdown.
+        * See blk_register_queue() for details.
+        */
+       if (percpu_ref_init(&q->q_usage_counter,
+                               blk_queue_usage_counter_release,
+                               PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
                goto fail_bdi;
  
+       if (blkcg_init_queue(q))
+               goto fail_ref;
        return q;
  
+ fail_ref:
+       percpu_ref_exit(&q->q_usage_counter);
  fail_bdi:
        bdi_destroy(&q->backing_dev_info);
  fail_id:
diff --cc block/blk-mq.c
index cfc07d18b4e12660475a06ac60d4c36224794792,93834302bcaf06828815e1df9f5e63adc93c2992..070ed0f2415115c3bf2ab21aa88c28b1d0f5f6d3
@@@ -77,50 -77,15 +77,16 @@@ static void blk_mq_hctx_clear_pending(s
        clear_bit(CTX_TO_BIT(hctx, ctx), &bm->word);
  }
  
- static int blk_mq_queue_enter(struct request_queue *q, gfp_t gfp)
- {
-       while (true) {
-               int ret;
-               if (percpu_ref_tryget_live(&q->mq_usage_counter))
-                       return 0;
-               if (!(gfp & __GFP_WAIT))
-                       return -EBUSY;
-               ret = wait_event_interruptible(q->mq_freeze_wq,
-                               !q->mq_freeze_depth || blk_queue_dying(q));
-               if (blk_queue_dying(q))
-                       return -ENODEV;
-               if (ret)
-                       return ret;
-       }
- }
- static void blk_mq_queue_exit(struct request_queue *q)
- {
-       percpu_ref_put(&q->mq_usage_counter);
- }
- static void blk_mq_usage_counter_release(struct percpu_ref *ref)
- {
-       struct request_queue *q =
-               container_of(ref, struct request_queue, mq_usage_counter);
-       wake_up_all(&q->mq_freeze_wq);
- }
  void blk_mq_freeze_queue_start(struct request_queue *q)
  {
-       bool freeze;
+       int freeze_depth;
  
-       mutex_lock(&q->mq_freeze_lock);
-       freeze = !q->mq_freeze_depth++;
-       if (freeze) {
-               percpu_ref_kill(&q->mq_usage_counter);
+       freeze_depth = atomic_inc_return(&q->mq_freeze_depth);
+       if (freeze_depth == 1) {
+               percpu_ref_kill(&q->q_usage_counter);
                blk_mq_run_hw_queues(q, false);
        }
 +      mutex_unlock(&q->mq_freeze_lock);
  }
  EXPORT_SYMBOL_GPL(blk_mq_freeze_queue_start);
  
@@@ -142,16 -123,14 +124,15 @@@ EXPORT_SYMBOL_GPL(blk_mq_freeze_queue)
  
  void blk_mq_unfreeze_queue(struct request_queue *q)
  {
-       bool wake;
+       int freeze_depth;
  
-       mutex_lock(&q->mq_freeze_lock);
-       wake = !--q->mq_freeze_depth;
-       WARN_ON_ONCE(q->mq_freeze_depth < 0);
-       if (wake) {
-               percpu_ref_reinit(&q->mq_usage_counter);
+       freeze_depth = atomic_dec_return(&q->mq_freeze_depth);
+       WARN_ON_ONCE(freeze_depth < 0);
+       if (!freeze_depth) {
+               percpu_ref_reinit(&q->q_usage_counter);
                wake_up_all(&q->mq_freeze_wq);
        }
 +      mutex_unlock(&q->mq_freeze_lock);
  }
  EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);
  
index 191d9dac5afc1e6cafcb393f3fe9c156e5548728,5ec4687bda03f7c2a00b0b78ce3040583d0fb3cf..42624303277ba1403d6c21fc2d4b1974f7c753ce
@@@ -174,12 -174,6 +174,12 @@@ xfs_setfilesize_ioend
        rwsem_acquire_read(&VFS_I(ip)->i_sb->s_writers.lock_map[SB_FREEZE_FS-1],
                           0, 1, _THIS_IP_);
  
-               xfs_trans_cancel(tp, 0);
 +      /* we abort the update if there was an IO error */
 +      if (ioend->io_error) {
++              xfs_trans_cancel(tp);
 +              return ioend->io_error;
 +      }
 +
        return xfs_setfilesize(ip, tp, ioend->io_offset, ioend->io_size);
  }
  
Simple merge
Simple merge
Simple merge
diff --cc mm/migrate.c
Simple merge