We need to keep an eye on this one as it replaces a number of zio_interrupt calls with zio_execute which will increase stack usage.

Xin did you do any tests on i386 at all?

    Regards
    Steve

On 09/11/2014 07:37, Xin LI wrote:
Author: delphij
Date: Sun Nov  9 07:37:00 2014
New Revision: 274304
URL: https://svnweb.freebsd.org/changeset/base/274304

Log:
   MFV r274272 and diff reduction with upstream.
Illumos issue:
       5244 zio pipeline callers should explicitly invoke next stage
Tested with: ztest plus ZFS over GELI configuration
   MFC after:   1 month

Modified:
   head/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
Directory Properties:
   head/cddl/contrib/opensolaris/   (props changed)
   head/sys/cddl/contrib/opensolaris/   (props changed)

Modified: head/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c   Sun Nov  9 
01:42:28 2014        (r274303)
+++ head/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c   Sun Nov  9 
07:37:00 2014        (r274304)
@@ -25,6 +25,7 @@
  /*
   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
   * Copyright 2012 Garrett D'Amore <garr...@damore.org>.  All rights reserved.
+ * Copyright (c) 2014 by Delphix. All rights reserved.
   */
#include <sys/zfs_context.h>
@@ -33,8 +34,10 @@ int taskq_now;
  taskq_t *system_taskq;
#define TASKQ_ACTIVE 0x00010000
+#define        TASKQ_NAMELEN   31
struct taskq {
+       char            tq_name[TASKQ_NAMELEN + 1];
        kmutex_t        tq_lock;
        krwlock_t       tq_threadlock;
        kcondvar_t      tq_dispatch_cv;
@@ -247,6 +250,7 @@ taskq_create(const char *name, int nthre
        cv_init(&tq->tq_dispatch_cv, NULL, CV_DEFAULT, NULL);
        cv_init(&tq->tq_wait_cv, NULL, CV_DEFAULT, NULL);
        cv_init(&tq->tq_maxalloc_cv, NULL, CV_DEFAULT, NULL);
+       (void) strncpy(tq->tq_name, name, TASKQ_NAMELEN + 1);
        tq->tq_flags = flags | TASKQ_ACTIVE;
        tq->tq_active = nthreads;
        tq->tq_nthreads = nthreads;

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -60,7 +60,7 @@ typedef int   vdev_open_func_t(vdev_t *vd,
      uint64_t *logical_ashift, uint64_t *physical_ashift);
  typedef void  vdev_close_func_t(vdev_t *vd);
  typedef uint64_t vdev_asize_func_t(vdev_t *vd, uint64_t psize);
-typedef int    vdev_io_start_func_t(zio_t *zio);
+typedef void   vdev_io_start_func_t(zio_t *zio);
  typedef void  vdev_io_done_func_t(zio_t *zio);
  typedef void  vdev_state_change_func_t(vdev_t *vd, int, int);
  typedef void  vdev_hold_func_t(vdev_t *vd);

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h       Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h       Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -152,9 +152,6 @@ typedef enum zio_priority {
        ZIO_PRIORITY_NOW                /* non-queued I/Os (e.g. ioctl) */
  } zio_priority_t;
-#define ZIO_PIPELINE_CONTINUE 0x100
-#define        ZIO_PIPELINE_STOP               0x101
-
  enum zio_flag {
        /*
         * Flags inherited by gang, ddt, and vdev children,

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c     Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c     Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -715,7 +715,7 @@ vdev_disk_ioctl_done(void *zio_arg, int
        zio_interrupt(zio);
  }
-static int
+static void
  vdev_disk_io_start(zio_t *zio)
  {
        vdev_t *vd = zio->io_vd;
@@ -732,7 +732,7 @@ vdev_disk_io_start(zio_t *zio)
        if (dvd == NULL || (dvd->vd_ldi_offline && dvd->vd_lh == NULL)) {
                zio->io_error = SET_ERROR(ENXIO);
                zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               return;
        }
if (zio->io_type == ZIO_TYPE_IOCTL) {
@@ -740,7 +740,7 @@ vdev_disk_io_start(zio_t *zio)
                if (!vdev_readable(vd)) {
                        zio->io_error = SET_ERROR(ENXIO);
                        zio_interrupt(zio);
-                       return (ZIO_PIPELINE_STOP);
+                       return;
                }
switch (zio->io_cmd) {
@@ -771,7 +771,7 @@ vdev_disk_io_start(zio_t *zio)
                                 * and will call vdev_disk_ioctl_done()
                                 * upon completion.
                                 */
-                               return (ZIO_PIPELINE_STOP);
+                               return;
                        }
if (error == ENOTSUP || error == ENOTTY) {
@@ -792,8 +792,8 @@ vdev_disk_io_start(zio_t *zio)
                        zio->io_error = SET_ERROR(ENOTSUP);
                }
- zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               zio_execute(zio);
+               return;
        }
vb = kmem_alloc(sizeof (vdev_buf_t), KM_SLEEP);
@@ -814,8 +814,6 @@ vdev_disk_io_start(zio_t *zio)
/* ldi_strategy() will return non-zero only on programming errors */
        VERIFY(ldi_strategy(dvd->vd_lh, bp) == 0);
-
-       return (ZIO_PIPELINE_STOP);
  }
static void

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c     Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c     Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -20,7 +20,7 @@
   */
  /*
   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights 
reserved.
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
   */
#include <sys/zfs_context.h>
@@ -154,7 +154,7 @@ vdev_file_close(vdev_t *vd)
        vd->vdev_tsd = NULL;
  }
-static int
+static void
  vdev_file_io_start(zio_t *zio)
  {
        vdev_t *vd = zio->io_vd;
@@ -165,7 +165,7 @@ vdev_file_io_start(zio_t *zio)
        if (!vdev_readable(vd)) {
                zio->io_error = SET_ERROR(ENXIO);
                zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               return;
        }
vf = vd->vdev_tsd;
@@ -181,8 +181,8 @@ vdev_file_io_start(zio_t *zio)
                        zio->io_error = SET_ERROR(ENOTSUP);
                }
- zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               zio_execute(zio);
+               return;
        }
zio->io_error = vn_rdwr(zio->io_type == ZIO_TYPE_READ ?
@@ -194,7 +194,10 @@ vdev_file_io_start(zio_t *zio)
zio_interrupt(zio); - return (ZIO_PIPELINE_STOP);
+#ifdef illumos
+       VERIFY3U(taskq_dispatch(system_taskq, vdev_file_io_strategy, bp,
+           TQ_SLEEP), !=, 0);
+#endif
  }
/* ARGSUSED */

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c     Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c     Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -788,7 +788,7 @@ vdev_geom_io_intr(struct bio *bp)
        zio_interrupt(zio);
  }
-static int
+static void
  vdev_geom_io_start(zio_t *zio)
  {
        vdev_t *vd;
@@ -803,6 +803,8 @@ vdev_geom_io_start(zio_t *zio)
                /* XXPOLICY */
                if (!vdev_readable(vd)) {
                        zio->io_error = SET_ERROR(ENXIO);
+                       zio_interrupt(zio);
+                       return;
                } else {
                        switch (zio->io_cmd) {
                        case DKIOCFLUSHWRITECACHE:
@@ -818,23 +820,23 @@ vdev_geom_io_start(zio_t *zio)
                        }
                }
- zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               zio_execute(zio);
+               return;
        case ZIO_TYPE_FREE:
                if (vd->vdev_notrim) {
                        zio->io_error = SET_ERROR(ENOTSUP);
                } else if (!vdev_geom_bio_delete_disable) {
                        goto sendreq;
                }
-               zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               zio_execute(zio);
+               return;
        }
  sendreq:
        cp = vd->vdev_tsd;
        if (cp == NULL) {
                zio->io_error = SET_ERROR(ENXIO);
                zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               return;
        }
        bp = g_alloc_bio();
        bp->bio_caller1 = zio;
@@ -863,8 +865,6 @@ sendreq:
        bp->bio_done = vdev_geom_io_intr;
g_io_request(bp, cp);
-
-       return (ZIO_PIPELINE_STOP);
  }
static void

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c   Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c   Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -24,7 +24,7 @@
   */
/*
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
   */
#include <sys/zfs_context.h>
@@ -425,7 +425,7 @@ vdev_mirror_child_select(zio_t *zio)
        return (-1);
  }
-static int
+static void
  vdev_mirror_io_start(zio_t *zio)
  {
        mirror_map_t *mm;
@@ -450,8 +450,8 @@ vdev_mirror_io_start(zio_t *zio)
                                    zio->io_type, zio->io_priority, 0,
                                    vdev_mirror_scrub_done, mc));
                        }
-                       zio_interrupt(zio);
-                       return (ZIO_PIPELINE_STOP);
+                       zio_execute(zio);
+                       return;
                }
                /*
                 * For normal reads just pick one child.
@@ -478,8 +478,7 @@ vdev_mirror_io_start(zio_t *zio)
                c++;
        }
- zio_interrupt(zio);
-       return (ZIO_PIPELINE_STOP);
+       zio_execute(zio);
  }
static int

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c  Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c  Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -24,7 +24,7 @@
   */
/*
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
   */
/*
@@ -67,12 +67,11 @@ vdev_missing_close(vdev_t *vd)
  }
/* ARGSUSED */
-static int
+static void
  vdev_missing_io_start(zio_t *zio)
  {
        zio->io_error = SET_ERROR(ENOTSUP);
-       zio_interrupt(zio);
-       return (ZIO_PIPELINE_STOP);
+       zio_execute(zio);
  }
/* ARGSUSED */

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c    Sun Nov 
 9 01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c    Sun Nov 
 9 07:37:00 2014        (r274304)
@@ -21,7 +21,7 @@
/*
   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights 
reserved.
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
   * Copyright (c) 2013, Joyent, Inc. All rights reserved.
   */
@@ -1726,7 +1726,7 @@ vdev_raidz_child_done(zio_t *zio)
   *      vdevs have had errors, then create zio read operations to the parity
   *      columns' VDevs as well.
   */
-static int
+static void
  vdev_raidz_io_start(zio_t *zio)
  {
        vdev_t *vd = zio->io_vd;
@@ -1756,8 +1756,8 @@ vdev_raidz_io_start(zio_t *zio)
                            vdev_raidz_child_done, rc));
                }
- zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               zio_execute(zio);
+               return;
        }
if (zio->io_type == ZIO_TYPE_WRITE) {
@@ -1789,8 +1789,8 @@ vdev_raidz_io_start(zio_t *zio)
                            ZIO_FLAG_NODATA | ZIO_FLAG_OPTIONAL, NULL, NULL));
                }
- zio_interrupt(zio);
-               return (ZIO_PIPELINE_STOP);
+               zio_execute(zio);
+               return;
        }
ASSERT(zio->io_type == ZIO_TYPE_READ);
@@ -1830,8 +1830,7 @@ vdev_raidz_io_start(zio_t *zio)
                }
        }
- zio_interrupt(zio);
-       return (ZIO_PIPELINE_STOP);
+       zio_execute(zio);
  }
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c   Sun Nov  9 
01:42:28 2014        (r274303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c   Sun Nov  9 
07:37:00 2014        (r274304)
@@ -90,6 +90,9 @@ kmem_cache_t *zio_data_buf_cache[SPA_MAX
  extern vmem_t *zio_alloc_arena;
  #endif
+#define ZIO_PIPELINE_CONTINUE 0x100
+#define        ZIO_PIPELINE_STOP               0x101
+
  /*
   * The following actions directly effect the spa's sync-to-convergence logic.
   * The values below define the sync pass when we start performing the action.
@@ -2557,6 +2560,18 @@ zio_free_zil(spa_t *spa, uint64_t txg, b
   * Read, write and delete to physical devices
   * ==========================================================================
   */
+
+
+/*
+ * Issue an I/O to the underlying vdev. Typically the issue pipeline
+ * stops after this stage and will resume upon I/O completion.
+ * However, there are instances where the vdev layer may need to
+ * continue the pipeline when an I/O was not issued. Since the I/O
+ * that was sent to the vdev layer might be different than the one
+ * currently active in the pipeline (see vdev_queue_io()), we explicitly
+ * force the underlying vdev layers to call either zio_execute() or
+ * zio_interrupt() to ensure that the pipeline continues with the correct I/O.
+ */
  static int
  zio_vdev_io_start(zio_t *zio)
  {
@@ -2575,7 +2590,8 @@ zio_vdev_io_start(zio_t *zio)
                /*
                 * The mirror_ops handle multiple DVAs in a single BP.
                 */
-               return (vdev_mirror_ops.vdev_op_io_start(zio));
+               vdev_mirror_ops.vdev_op_io_start(zio);
+               return (ZIO_PIPELINE_STOP);
        }
if (vd->vdev_ops->vdev_op_leaf && zio->io_type == ZIO_TYPE_FREE &&
@@ -2589,7 +2605,7 @@ zio_vdev_io_start(zio_t *zio)
         * can quickly react to certain workloads.  In particular, we care
         * about non-scrubbing, top-level reads and writes with the following
         * characteristics:
-        *      - synchronous writes of user data to non-slog devices
+        *      - synchronous writes of user data to non-slog devices
         *      - any reads of user data
         * When these conditions are met, adjust the timestamp of spa_last_io
         * which allows the scan thread to adjust its workload accordingly.
@@ -2693,10 +2709,8 @@ zio_vdev_io_start(zio_t *zio)
                        return (ZIO_PIPELINE_STOP);
        }
- ret = vd->vdev_ops->vdev_op_io_start(zio);
-       ASSERT(ret == ZIO_PIPELINE_STOP);
-
-       return (ret);
+       vd->vdev_ops->vdev_op_io_start(zio);
+       return (ZIO_PIPELINE_STOP);
  }
static int


_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to