Skip to contentSkip to conversation

libosd: osd_req_read_sg, optimize the single entry case

PATCH In review Boaz Harrosh 1 participant 2 messages Jan 23, 2011 SCSI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 libosd: osd_req_read_sg, optimize the single entry case

Since sg-read is a bidi operation, it is a gain to convert a single sg entry into a regular read. Better do this in the generic layer then force each caller to do so.

---
 drivers/scsi/osd/osd_initiator.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)
drivers/scsi/osd/osd_initiator.c +16 -4
index 0433ea6..19ddf65 100644
@@ -1005,11 +1005,23 @@ int osd_req_read_sg(struct osd_request *or,
 	const struct osd_sg_entry *sglist, unsigned numentries)
 {
 	u64 len;
-	int ret = _add_sg_continuation_descriptor(or, sglist, numentries, &len);
+	u64 off;
+	int ret;
 
-	if (ret)
-		return ret;
-	osd_req_read(or, obj, 0, bio, len);
+	if (numentries > 1) {
+		off = 0;
+		ret = _add_sg_continuation_descriptor(or, sglist, numentries,
+						      &len);
+		if (ret)
+			return ret;
+	} else {
+		/* Optimize the case of single segment, read_sg is a
+		 * bidi operation.
+		 */
+		len = sglist->len;
+		off = sglist->offset;
+	}
+	osd_req_read(or, obj, off, bio, len);
 
 	return 0;
 }
Signature · 1 line
1.7.2.3
#1 lore raw
Quoted 32 lines · Boaz Harrosh

Since sg-read is a bidi operation, it is a gain to convert a single sg entry into a regular read. Better do this in the generic layer then force each caller to do so.

---
 drivers/scsi/osd/osd_initiator.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)
drivers/scsi/osd/osd_initiator.c +9 -4
index 0433ea6..19ddf65 100644
@@ -1005,11 +1005,23 @@ int osd_req_read_sg(struct osd_request *or,
 	const struct osd_sg_entry *sglist, unsigned numentries)
 {
 	u64 len;
-	int ret = _add_sg_continuation_descriptor(or, sglist, numentries, &len);
+	u64 off;
+	int ret;
 
-	if (ret)
-		return ret;
-	osd_req_read(or, obj, 0, bio, len);
+	if (numentries > 1) {
+		off = 0;
+		ret = _add_sg_continuation_descriptor(or, sglist, numentries,
+						      &len);
+		if (ret)
+			return ret;
+	} else {

drivers/scsi/osd/osd_initiator.c int osd_req_read_sg(struct osd_request *or, · line 1027

Quoted 10 lines
drivers/scsi/osd/osd_initiator.c +7 -0
+		/* Optimize the case of single segment, read_sg is a
+		 * bidi operation.
+		 */
+		len = sglist->len;
+		off = sglist->offset;
+	}
+	osd_req_read(or, obj, off, bio, len);
 
 	return 0;
 }

James please include this patch into scsi-misc for the next merge window.

Thanks
Boaz