Author: scottl
Date: Tue Jul 19 19:09:23 2016
New Revision: 303040
URL: https://svnweb.freebsd.org/changeset/base/303040

Log:
  Supporting flushing the dump before returning, and simplify/combine the
  logic.  Switch to a 5us delay since most NVME devices can easily do 200,000
  iops.
  
  Submitted by: imp
  MFC after:    3 days
  Sponsored by: Netflix, Inc.

Modified:
  head/sys/dev/nvd/nvd.c
  head/sys/dev/nvme/nvme_ns_cmd.c

Modified: head/sys/dev/nvd/nvd.c
==============================================================================
--- head/sys/dev/nvd/nvd.c      Tue Jul 19 19:00:22 2016        (r303039)
+++ head/sys/dev/nvd/nvd.c      Tue Jul 19 19:09:23 2016        (r303040)
@@ -237,14 +237,7 @@ nvd_dump(void *arg, void *virt, vm_offse
        dp = arg;
        ndisk = dp->d_drv1;
 
-       if (len > 0) {
-               if ((error = nvme_ns_dump(ndisk->ns, virt, offset, len)) != 0)
-                       return (error);
-       } else {
-               /* XXX sync to stable storage */
-       }
-
-       return (0);
+       return (nvme_ns_dump(ndisk->ns, virt, offset, len));
 }
 
 static void

Modified: head/sys/dev/nvme/nvme_ns_cmd.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns_cmd.c     Tue Jul 19 19:00:22 2016        
(r303039)
+++ head/sys/dev/nvme/nvme_ns_cmd.c     Tue Jul 19 19:09:23 2016        
(r303040)
@@ -153,7 +153,7 @@ nvme_ns_cmd_flush(struct nvme_namespace 
 }
 
 /* Timeout = 1 sec */
-#define NVD_DUMP_TIMEOUT       100000
+#define NVD_DUMP_TIMEOUT       200000
 
 int
 nvme_ns_dump(struct nvme_namespace *ns, void *virt, off_t offset, size_t len)
@@ -171,14 +171,13 @@ nvme_ns_dump(struct nvme_namespace *ns, 
                return (ENOMEM);
 
        cmd = &req->cmd;
-       cmd->opc = NVME_OPC_WRITE;
-       cmd->nsid = ns->id;
 
-       lba = offset / nvme_ns_get_sector_size(ns);
-       lba_count = len / nvme_ns_get_sector_size(ns);
-
-       *(uint64_t *)&cmd->cdw10 = lba;
-       cmd->cdw12 = lba_count - 1;
+       if (len > 0) {
+               lba = offset / nvme_ns_get_sector_size(ns);
+               lba_count = len / nvme_ns_get_sector_size(ns);
+               nvme_ns_write_cmd(cmd, ns->id, lba, lba_count);
+       } else
+               nvme_ns_flush_cmd(cmd, ns->id);
 
        nvme_ctrlr_submit_io_request(ns->ctrlr, req);
        if (req->qpair == NULL)
@@ -186,7 +185,7 @@ nvme_ns_dump(struct nvme_namespace *ns, 
 
        i = 0;
        while ((i++ < NVD_DUMP_TIMEOUT) && (status.done == FALSE)) {
-               DELAY(10);
+               DELAY(5);
                nvme_qpair_process_completions(req->qpair);
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to