From: James Bottomley <James.Bottomley@steeleye.com>
To: Jeremy Higdon <jeremy@sgi.com>
Cc: SCSI Mailing List <linux-scsi@vger.kernel.org>,
jbarnes@cthulhu.engr.sgi.com
Subject: Re: max_hw_segments vs. max_phys_segments and scsi_alloc_queue()
Date: 26 Feb 2004 09:02:57 -0600 [thread overview]
Message-ID: <1077807779.1756.9.camel@mulgrave> (raw)
In-Reply-To: <20040226071558.GA559837@sgi.com>
On Thu, 2004-02-26 at 01:15, Jeremy Higdon wrote:
> 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.
No, max_hw_segments is the maximum size of the PCI device's sg table.
max_hw_segments is the size of the internal sg list before dma_map_sg()
gets its paws on it. The only parameter the drivers care about is
max_hw_segments. It's the mid-layer that cares about the
max_phys_segments because the mid-layer provides the memory for the sg
list that comes out of blk_rq_map_sg()
> 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.
That's correct. No virtual merging => max_phys_segments ==
max_hw_segments.
> 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?
No, you can't do this (or at least, not simply like your patch).
Like I said, the mid-layer has to allocate the sg table coming out of
blk_rq_map_sg(). It does this in scsi_alloc_sgtable() using mempools,
and the maximum sg table size it's expecting is MAX_PHYS_SEGMENTS. If
you increase max_phys_segments beyond what the mid-layer can cope with,
you'll end up with a request we can never map.
We'd have to rejig the entire mempool setup to increase this (even
though it looks like it's nicely coded to be variable for
MAX_PHYS_SEGMENTS, in fact, the mempools are coded assuming that the
value is 128).
James
prev parent reply other threads:[~2004-02-26 15:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-26 7:15 max_hw_segments vs. max_phys_segments and scsi_alloc_queue() Jeremy Higdon
2004-02-26 15:02 ` James Bottomley [this message]
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=1077807779.1756.9.camel@mulgrave \
--to=james.bottomley@steeleye.com \
--cc=jbarnes@cthulhu.engr.sgi.com \
--cc=jeremy@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.