]> Git Repo - J-linux.git/commitdiff
Merge tag 'block-5.13-2021-05-07' of git://git.kernel.dk/linux-block
authorLinus Torvalds <[email protected]>
Fri, 7 May 2021 18:35:12 +0000 (11:35 -0700)
committerLinus Torvalds <[email protected]>
Fri, 7 May 2021 18:35:12 +0000 (11:35 -0700)
Pull block fixes from Jens Axboe:

 - dasd spelling fixes (Bhaskar)

 - Limit bio max size on multi-page bvecs to the hardware limit, to
   avoid overly large bio's (and hence latencies). Originally queued for
   the merge window, but needed a fix and was dropped from the initial
   pull (Changheun)

 - NVMe pull request (Christoph):
      - reset the bdev to ns head when failover (Daniel Wagner)
      - remove unsupported command noise (Keith Busch)
      - misc passthrough improvements (Kanchan Joshi)
      - fix controller ioctl through ns_head (Minwoo Im)
      - fix controller timeouts during reset (Tao Chiu)

 - rnbd fixes/cleanups (Gioh, Md, Dima)

 - Fix iov_iter re-expansion (yangerkun)

* tag 'block-5.13-2021-05-07' of git://git.kernel.dk/linux-block:
  block: reexpand iov_iter after read/write
  nvmet: remove unsupported command noise
  nvme-multipath: reset bdev to ns head when failover
  nvme-pci: fix controller reset hang when racing with nvme_timeout
  nvme: move the fabrics queue ready check routines to core
  nvme: avoid memset for passthrough requests
  nvme: add nvme_get_ns helper
  nvme: fix controller ioctl through ns_head
  bio: limit bio max size
  RDMA/rtrs: fix uninitialized symbol 'cnt'
  s390: dasd: Mundane spelling fixes
  block/rnbd: Remove all likely and unlikely
  block/rnbd-clt: Check the return value of the function rtrs_clt_query
  block/rnbd: Fix style issues
  block/rnbd-clt: Change queue_depth type in rnbd_clt_session to size_t

1  2 
block/blk-settings.c
drivers/infiniband/ulp/rtrs/rtrs-clt.c
fs/block_dev.c
include/linux/blkdev.h

diff --combined block/blk-settings.c
index 902c40d67120251564b1c17529f0557cea76d872,c646503e55d2265f62f0ee7c9bdd1ee20fb6305d..c6f80e3b8020e4a8833a602c01eb2a07eecf5fa6
@@@ -7,7 -7,6 +7,7 @@@
  #include <linux/init.h>
  #include <linux/bio.h>
  #include <linux/blkdev.h>
 +#include <linux/pagemap.h>
  #include <linux/gcd.h>
  #include <linux/lcm.h>
  #include <linux/jiffies.h>
@@@ -32,6 -31,7 +32,7 @@@ EXPORT_SYMBOL_GPL(blk_queue_rq_timeout)
   */
  void blk_set_default_limits(struct queue_limits *lim)
  {
+       lim->bio_max_bytes = UINT_MAX;
        lim->max_segments = BLK_MAX_SEGMENTS;
        lim->max_discard_segments = 1;
        lim->max_integrity_segments = 0;
@@@ -140,6 -140,10 +141,10 @@@ void blk_queue_max_hw_sectors(struct re
                                 limits->logical_block_size >> SECTOR_SHIFT);
        limits->max_sectors = max_sectors;
  
+       if (check_shl_overflow(max_sectors, SECTOR_SHIFT,
+                               &limits->bio_max_bytes))
+               limits->bio_max_bytes = UINT_MAX;
        q->backing_dev_info->io_pages = max_sectors >> (PAGE_SHIFT - 9);
  }
  EXPORT_SYMBOL(blk_queue_max_hw_sectors);
index 40f4383764debef9c20789640bf815529b2d996a,934a2ff18e7ff503ff8f80ebc649ffda7c04a2bd..0a794d748a7a68d098038eaf8de2144b0089bd87
@@@ -325,7 -325,7 +325,7 @@@ static void rtrs_rdma_error_recovery(st
  
  static void rtrs_clt_fast_reg_done(struct ib_cq *cq, struct ib_wc *wc)
  {
 -      struct rtrs_clt_con *con = cq->cq_context;
 +      struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
  
        if (unlikely(wc->status != IB_WC_SUCCESS)) {
                rtrs_err(con->c.sess, "Failed IB_WR_REG_MR: %s\n",
@@@ -345,7 -345,7 +345,7 @@@ static void rtrs_clt_inv_rkey_done(stru
  {
        struct rtrs_clt_io_req *req =
                container_of(wc->wr_cqe, typeof(*req), inv_cqe);
 -      struct rtrs_clt_con *con = cq->cq_context;
 +      struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
  
        if (unlikely(wc->status != IB_WC_SUCCESS)) {
                rtrs_err(con->c.sess, "Failed IB_WR_LOCAL_INV: %s\n",
@@@ -437,13 -437,6 +437,13 @@@ static void complete_rdma_req(struct rt
        req->in_use = false;
        req->con = NULL;
  
 +      if (errno) {
 +              rtrs_err_rl(con->c.sess,
 +                          "IO request failed: error=%d path=%s [%s:%u]\n",
 +                          errno, kobject_name(&sess->kobj), sess->hca_name,
 +                          sess->hca_port);
 +      }
 +
        if (notify)
                req->conf(req->priv, errno);
  }
@@@ -593,7 -586,7 +593,7 @@@ static int rtrs_post_recv_empty_x2(stru
  
  static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
  {
 -      struct rtrs_clt_con *con = cq->cq_context;
 +      struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
        struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess);
        u32 imm_type, imm_payload;
        bool w_inval = false;
                } else if (imm_type == RTRS_HB_ACK_IMM) {
                        WARN_ON(con->c.cid);
                        sess->s.hb_missed_cnt = 0;
 +                      sess->s.hb_cur_latency =
 +                              ktime_sub(ktime_get(), sess->s.hb_last_sent);
                        if (sess->flags & RTRS_MSG_NEW_RKEY_F)
                                return  rtrs_clt_recv_done(con, wc);
                } else {
@@@ -835,57 -826,6 +835,57 @@@ static struct rtrs_clt_sess *get_next_p
        return min_path;
  }
  
 +/**
 + * get_next_path_min_latency() - Returns path with minimal latency.
 + * @it:       the path pointer
 + *
 + * Return: a path with the lowest latency or NULL if all paths are tried
 + *
 + * Locks:
 + *    rcu_read_lock() must be hold.
 + *
 + * Related to @MP_POLICY_MIN_LATENCY
 + *
 + * This DOES skip an already-tried path.
 + * There is a skip-list to skip a path if the path has tried but failed.
 + * It will try the minimum latency path and then the second minimum latency
 + * path and so on. Finally it will return NULL if all paths are tried.
 + * Therefore the caller MUST check the returned
 + * path is NULL and trigger the IO error.
 + */
 +static struct rtrs_clt_sess *get_next_path_min_latency(struct path_it *it)
 +{
 +      struct rtrs_clt_sess *min_path = NULL;
 +      struct rtrs_clt *clt = it->clt;
 +      struct rtrs_clt_sess *sess;
 +      ktime_t min_latency = INT_MAX;
 +      ktime_t latency;
 +
 +      list_for_each_entry_rcu(sess, &clt->paths_list, s.entry) {
 +              if (unlikely(READ_ONCE(sess->state) != RTRS_CLT_CONNECTED))
 +                      continue;
 +
 +              if (unlikely(!list_empty(raw_cpu_ptr(sess->mp_skip_entry))))
 +                      continue;
 +
 +              latency = sess->s.hb_cur_latency;
 +
 +              if (latency < min_latency) {
 +                      min_latency = latency;
 +                      min_path = sess;
 +              }
 +      }
 +
 +      /*
 +       * add the path to the skip list, so that next time we can get
 +       * a different one
 +       */
 +      if (min_path)
 +              list_add(raw_cpu_ptr(min_path->mp_skip_entry), &it->skip_list);
 +
 +      return min_path;
 +}
 +
  static inline void path_it_init(struct path_it *it, struct rtrs_clt *clt)
  {
        INIT_LIST_HEAD(&it->skip_list);
  
        if (clt->mp_policy == MP_POLICY_RR)
                it->next_path = get_next_path_rr;
 -      else
 +      else if (clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
                it->next_path = get_next_path_min_inflight;
 +      else
 +              it->next_path = get_next_path_min_latency;
  }
  
  static inline void path_it_deinit(struct path_it *it)
@@@ -1082,10 -1020,7 +1082,10 @@@ static int rtrs_clt_write_req(struct rt
                                       req->usr_len + sizeof(*msg),
                                       imm);
        if (unlikely(ret)) {
 -              rtrs_err(s, "Write request failed: %d\n", ret);
 +              rtrs_err_rl(s,
 +                          "Write request failed: error=%d path=%s [%s:%u]\n",
 +                          ret, kobject_name(&sess->kobj), sess->hca_name,
 +                          sess->hca_port);
                if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
                        atomic_dec(&sess->stats->inflight);
                if (req->sg_cnt)
@@@ -1117,7 -1052,7 +1117,7 @@@ static int rtrs_clt_read_req(struct rtr
        struct rtrs_sess *s = con->c.sess;
        struct rtrs_clt_sess *sess = to_clt_sess(s);
        struct rtrs_msg_rdma_read *msg;
 -      struct rtrs_ib_dev *dev;
 +      struct rtrs_ib_dev *dev = sess->s.dev;
  
        struct ib_reg_wr rwr;
        struct ib_send_wr *wr = NULL;
  
        const size_t tsize = sizeof(*msg) + req->data_len + req->usr_len;
  
 -      s = &sess->s;
 -      dev = sess->s.dev;
 -
        if (unlikely(tsize > sess->chunk_size)) {
                rtrs_wrn(s,
                          "Read request failed, message size is %zu, bigger than CHUNK_SIZE %d\n",
        ret = rtrs_post_send_rdma(req->con, req, &sess->rbufs[buf_id],
                                   req->data_len, imm, wr);
        if (unlikely(ret)) {
 -              rtrs_err(s, "Read request failed: %d\n", ret);
 +              rtrs_err_rl(s,
 +                          "Read request failed: error=%d path=%s [%s:%u]\n",
 +                          ret, kobject_name(&sess->kobj), sess->hca_name,
 +                          sess->hca_port);
                if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
                        atomic_dec(&sess->stats->inflight);
                req->need_inv = false;
@@@ -1928,14 -1863,12 +1928,14 @@@ static int rtrs_clt_rdma_cm_handler(str
        case RDMA_CM_EVENT_UNREACHABLE:
        case RDMA_CM_EVENT_ADDR_CHANGE:
        case RDMA_CM_EVENT_TIMEWAIT_EXIT:
 -              rtrs_wrn(s, "CM error event %d\n", ev->event);
 +              rtrs_wrn(s, "CM error (CM event: %s, err: %d)\n",
 +                       rdma_event_msg(ev->event), ev->status);
                cm_err = -ECONNRESET;
                break;
        case RDMA_CM_EVENT_ADDR_ERROR:
        case RDMA_CM_EVENT_ROUTE_ERROR:
 -              rtrs_wrn(s, "CM error event %d\n", ev->event);
 +              rtrs_wrn(s, "CM error (CM event: %s, err: %d)\n",
 +                       rdma_event_msg(ev->event), ev->status);
                cm_err = -EHOSTUNREACH;
                break;
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
                rtrs_clt_close_conns(sess, false);
                return 0;
        default:
 -              rtrs_err(s, "Unexpected RDMA CM event (%d)\n", ev->event);
 +              rtrs_err(s, "Unexpected RDMA CM error (CM event: %s, err: %d)\n",
 +                       rdma_event_msg(ev->event), ev->status);
                cm_err = -ECONNRESET;
                break;
        }
@@@ -2319,7 -2251,7 +2319,7 @@@ destroy
  
  static void rtrs_clt_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
  {
 -      struct rtrs_clt_con *con = cq->cq_context;
 +      struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
        struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess);
        struct rtrs_iu *iu;
  
@@@ -2401,7 -2333,7 +2401,7 @@@ static int process_info_rsp(struct rtrs
  
  static void rtrs_clt_info_rsp_done(struct ib_cq *cq, struct ib_wc *wc)
  {
 -      struct rtrs_clt_con *con = cq->cq_context;
 +      struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
        struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess);
        struct rtrs_msg_info_rsp *msg;
        enum rtrs_clt_state state;
  static int init_sess(struct rtrs_clt_sess *sess)
  {
        int err;
 +      char str[NAME_MAX];
 +      struct rtrs_addr path = {
 +              .src = &sess->s.src_addr,
 +              .dst = &sess->s.dst_addr,
 +      };
 +
 +      rtrs_addr_to_str(&path, str, sizeof(str));
  
        mutex_lock(&sess->init_mutex);
        err = init_conns(sess);
        if (err) {
 -              rtrs_err(sess->clt, "init_conns(), err: %d\n", err);
 +              rtrs_err(sess->clt,
 +                       "init_conns() failed: err=%d path=%s [%s:%u]\n", err,
 +                       str, sess->hca_name, sess->hca_port);
                goto out;
        }
        err = rtrs_send_sess_info(sess);
        if (err) {
 -              rtrs_err(sess->clt, "rtrs_send_sess_info(), err: %d\n", err);
 +              rtrs_err(
 +                      sess->clt,
 +                      "rtrs_send_sess_info() failed: err=%d path=%s [%s:%u]\n",
 +                      err, str, sess->hca_name, sess->hca_port);
                goto out;
        }
        rtrs_clt_sess_up(sess);
@@@ -2871,8 -2791,8 +2871,8 @@@ int rtrs_clt_remove_path_from_sysfs(str
        } while (!changed && old_state != RTRS_CLT_DEAD);
  
        if (likely(changed)) {
 -              rtrs_clt_destroy_sess_files(sess, sysfs_self);
                rtrs_clt_remove_path_from_arr(sess);
 +              rtrs_clt_destroy_sess_files(sess, sysfs_self);
                kobject_put(&sess->kobj);
        }
  
@@@ -2976,7 -2896,8 +2976,8 @@@ EXPORT_SYMBOL(rtrs_clt_request)
  
  int rtrs_clt_rdma_cq_direct(struct rtrs_clt *clt, unsigned int index)
  {
-       int cnt;
+       /* If no path, return -1 for block layer not to try again */
+       int cnt = -1;
        struct rtrs_con *con;
        struct rtrs_clt_sess *sess;
        struct path_it it;
@@@ -3013,9 -2934,9 +3014,9 @@@ int rtrs_clt_query(struct rtrs_clt *clt
                return -ECOMM;
  
        attr->queue_depth      = clt->queue_depth;
 -      attr->max_io_size      = clt->max_io_size;
 -      attr->sess_kobj        = &clt->dev.kobj;
 -      strlcpy(attr->sessname, clt->sessname, sizeof(attr->sessname));
 +      /* Cap max_io_size to min of remote buffer size and the fr pages */
 +      attr->max_io_size = min_t(int, clt->max_io_size,
 +                                clt->max_segments * SZ_4K);
  
        return 0;
  }
diff --combined fs/block_dev.c
index 9114e0a0e7b4a5a05b56d0ff6bb220f68da085bf,eb265d72fce89b43266ffec40fb6b9ffa38a1689..b8abccd03e5d55efd2abf8392420fdf1856c3479
@@@ -79,7 -79,7 +79,7 @@@ static void kill_bdev(struct block_devi
  {
        struct address_space *mapping = bdev->bd_inode->i_mapping;
  
 -      if (mapping->nrpages == 0 && mapping->nrexceptional == 0)
 +      if (mapping_empty(mapping))
                return;
  
        invalidate_bh_lrus();
@@@ -1677,6 -1677,7 +1677,7 @@@ ssize_t blkdev_write_iter(struct kiocb 
        struct inode *bd_inode = bdev_file_inode(file);
        loff_t size = i_size_read(bd_inode);
        struct blk_plug plug;
+       size_t shorted = 0;
        ssize_t ret;
  
        if (bdev_read_only(I_BDEV(bd_inode)))
        if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT)
                return -EOPNOTSUPP;
  
-       iov_iter_truncate(from, size - iocb->ki_pos);
+       size -= iocb->ki_pos;
+       if (iov_iter_count(from) > size) {
+               shorted = iov_iter_count(from) - size;
+               iov_iter_truncate(from, size);
+       }
  
        blk_start_plug(&plug);
        ret = __generic_file_write_iter(iocb, from);
        if (ret > 0)
                ret = generic_write_sync(iocb, ret);
+       iov_iter_reexpand(from, iov_iter_count(from) + shorted);
        blk_finish_plug(&plug);
        return ret;
  }
@@@ -1711,13 -1717,21 +1717,21 @@@ ssize_t blkdev_read_iter(struct kiocb *
        struct inode *bd_inode = bdev_file_inode(file);
        loff_t size = i_size_read(bd_inode);
        loff_t pos = iocb->ki_pos;
+       size_t shorted = 0;
+       ssize_t ret;
  
        if (pos >= size)
                return 0;
  
        size -= pos;
-       iov_iter_truncate(to, size);
-       return generic_file_read_iter(iocb, to);
+       if (iov_iter_count(to) > size) {
+               shorted = iov_iter_count(to) - size;
+               iov_iter_truncate(to, size);
+       }
+       ret = generic_file_read_iter(iocb, to);
+       iov_iter_reexpand(to, iov_iter_count(to) + shorted);
+       return ret;
  }
  EXPORT_SYMBOL_GPL(blkdev_read_iter);
  
diff --combined include/linux/blkdev.h
index 1255823b2bc0fff0dcb75535333f809bc886d9c4,40c7c4d87aa1fae0dc1c55dcd76183a29ddd2eae..9fb255b48a57ac148578ea21f478d6306da73aca
@@@ -11,6 -11,7 +11,6 @@@
  #include <linux/minmax.h>
  #include <linux/timer.h>
  #include <linux/workqueue.h>
 -#include <linux/pagemap.h>
  #include <linux/backing-dev-defs.h>
  #include <linux/wait.h>
  #include <linux/mempool.h>
@@@ -326,6 -327,8 +326,8 @@@ enum blk_bounce 
  };
  
  struct queue_limits {
+       unsigned int            bio_max_bytes;
        enum blk_bounce         bounce;
        unsigned long           seg_boundary_mask;
        unsigned long           virt_boundary_mask;
This page took 0.08229 seconds and 4 git commands to generate.