Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Jul 2013 21:33:24 +0000 (UTC)
From:      Jim Harris <jimharris@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r253474 - in head: sbin/nvmecontrol sys/dev/nvme
Message-ID:  <201307192133.r6JLXOQ9060219@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jimharris
Date: Fri Jul 19 21:33:24 2013
New Revision: 253474
URL: http://svnweb.freebsd.org/changeset/base/253474

Log:
  Fix nvme(4) and nvd(4) to support non 512-byte sector sizes.
  
  Recent testing with QEMU that has variable sector size support for
  NVMe uncovered some of these issues.  Chatham prototype boards supported
  only 512 byte sectors.
  
  Sponsored by:	Intel
  Reviewed by:	carl
  MFC after:	3 days

Modified:
  head/sbin/nvmecontrol/devlist.c
  head/sys/dev/nvme/nvme_ns.c
  head/sys/dev/nvme/nvme_ns_cmd.c

Modified: head/sbin/nvmecontrol/devlist.c
==============================================================================
--- head/sbin/nvmecontrol/devlist.c	Fri Jul 19 21:30:53 2013	(r253473)
+++ head/sbin/nvmecontrol/devlist.c	Fri Jul 19 21:33:24 2013	(r253474)
@@ -53,7 +53,7 @@ static inline uint32_t
 ns_get_sector_size(struct nvme_namespace_data *nsdata)
 {
 
-	return (1 << nsdata->lbaf[0].lbads);
+	return (1 << nsdata->lbaf[nsdata->flbas.format].lbads);
 }
 
 void

Modified: head/sys/dev/nvme/nvme_ns.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns.c	Fri Jul 19 21:30:53 2013	(r253473)
+++ head/sys/dev/nvme/nvme_ns.c	Fri Jul 19 21:33:24 2013	(r253474)
@@ -155,7 +155,7 @@ nvme_ns_get_max_io_xfer_size(struct nvme
 uint32_t
 nvme_ns_get_sector_size(struct nvme_namespace *ns)
 {
-	return (1 << ns->data.lbaf[0].lbads);
+	return (1 << ns->data.lbaf[ns->data.flbas.format].lbads);
 }
 
 uint64_t
@@ -310,6 +310,16 @@ nvme_ns_construct(struct nvme_namespace 
 	}
 #endif
 
+	/*
+	 * Note: format is a 0-based value, so > is appropriate here,
+	 *  not >=.
+	 */
+	if (ns->data.flbas.format > ns->data.nlbaf) {
+		printf("lba format %d exceeds number supported (%d)\n",
+		    ns->data.flbas.format, ns->data.nlbaf+1);
+		return (1);
+	}
+
 	if (ctrlr->cdata.oncs.dsm)
 		ns->flags |= NVME_NS_DEALLOCATE_SUPPORTED;
 

Modified: head/sys/dev/nvme/nvme_ns_cmd.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns_cmd.c	Fri Jul 19 21:30:53 2013	(r253473)
+++ head/sys/dev/nvme/nvme_ns_cmd.c	Fri Jul 19 21:33:24 2013	(r253474)
@@ -36,7 +36,8 @@ nvme_ns_cmd_read(struct nvme_namespace *
 	struct nvme_request	*req;
 	struct nvme_command	*cmd;
 
-	req = nvme_allocate_request_vaddr(payload, lba_count*512, cb_fn, cb_arg);
+	req = nvme_allocate_request_vaddr(payload,
+	    lba_count*nvme_ns_get_sector_size(ns), cb_fn, cb_arg);
 
 	if (req == NULL)
 		return (ENOMEM);
@@ -89,8 +90,8 @@ nvme_ns_cmd_write(struct nvme_namespace 
 	struct nvme_request	*req;
 	struct nvme_command	*cmd;
 
-	req = nvme_allocate_request_vaddr(payload, lba_count*512, cb_fn,
-	    cb_arg);
+	req = nvme_allocate_request_vaddr(payload,
+	    lba_count*nvme_ns_get_sector_size(ns), cb_fn, cb_arg);
 
 	if (req == NULL)
 		return (ENOMEM);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307192133.r6JLXOQ9060219>