From: Jeremy Higdon <jeremy@sgi.com>
To: linux-scsi@vger.kernel.org
Cc: jbarnes@cthulhu.engr.sgi.com
Subject: max_hw_segments vs. max_phys_segments and scsi_alloc_queue()
Date: Wed, 25 Feb 2004 23:15:58 -0800 [thread overview]
Message-ID: <20040226071558.GA559837@sgi.com> (raw)
In scsi_alloc_queue(), I see the following two lines:
blk_queue_max_hw_segments(q, shost->sg_tablesize);
blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS);
I've been looking through the block code a bit, and it looks to me
as though max_phys_segments more accurately describes what the
I/O device hardware is capable of, while max_hw_segments is used
when you have an IOMMU.
That is, max_hw_segments is the number of discrete segments that
a PCI device would see, while max_phys_segments would be the
max s/g list size that a PCI device could handle.
It further seems as though when there is no IOMMU that the number
of hw_segments will equal the number of phys_segments, at least if I
understand the code in blk_recount_segments() and the comments
around the definition of BIO_VMERGE_BOUNDARY in
include/asm-ia64/io.h.
In particular, on ia64 machines, where BIO_VMERGE_BOUNDARY is
currently 0, and thus, the number of hw_segments equals the number
of phys_segments, we should be using the host's sg_tablesize to
set the max number of phys segments (as well as the max number
of hw segments). I see no reason why this wouldn't carry forward
to the other architectures, though there may be limits to the
total amount of data that could be mapped. This would have to
be fed to the block layer from the arch layer, though, I think.
Does this make sense, or have I completely missed something?
thanks
jeremy
===== drivers/scsi/scsi_lib.c 1.120 vs edited =====
--- 1.120/drivers/scsi/scsi_lib.c Mon Feb 23 06:21:36 2004
+++ edited/drivers/scsi/scsi_lib.c Wed Feb 25 23:13:35 2004
@@ -1285,7 +1285,7 @@
blk_queue_prep_rq(q, scsi_prep_fn);
blk_queue_max_hw_segments(q, shost->sg_tablesize);
- blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS);
+ blk_queue_max_phys_segments(q, shost->sg_tablesize);
blk_queue_max_sectors(q, shost->max_sectors);
blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost));
blk_queue_segment_boundary(q, shost->dma_boundary);
next reply other threads:[~2004-02-26 7:15 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-26 7:15 Jeremy Higdon [this message]
2004-02-26 15:02 ` max_hw_segments vs. max_phys_segments and scsi_alloc_queue() James Bottomley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040226071558.GA559837@sgi.com \
--to=jeremy@sgi.com \
--cc=jbarnes@cthulhu.engr.sgi.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox