From: "Kai Mäkisara" <kai.makisara@kolumbus.fi>
To: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: lkolbe@techfak.uni-bielefeld.de, linux-scsi@vger.kernel.org
Subject: Re: After memory pressure: can't read from tape anymore
Date: Fri, 03 Dec 2010 16:59:29 +0200 [thread overview]
Message-ID: <4CF905D1.6050903@kolumbus.fi> (raw)
In-Reply-To: <20101203212453W.fujita.tomonori@lab.ntt.co.jp>
On 12/03/2010 02:27 PM, FUJITA Tomonori wrote:
> On Mon, 29 Nov 2010 19:09:46 +0200 (EET)
> Kai Makisara<Kai.Makisara@kolumbus.fi> wrote:
>
>>> This same behaviour appears when we're doing a few incremental backups;
>>> after a while, it just isn't possible to use the tape drives anymore -
>>> every I/O operation gives an I/O Error, even a simple dd bs=64k
>>> count=10. After a restart, the system behaves correctly until
>>> -seemingly- another memory pressure situation occured.
>>>
>> This is predictable. The maximum number of scatter/gather segments seems
>> to be 128. The st driver first tries to set up transfer directly from the
>> user buffer to the HBA. The user buffer is usually fragmented so that one
>> scatter/gather segment is used for each page. Assuming 4 kB page size, the
>> maximu size of the direct transfer is 128 x 4 = 512 kB.
>
> Can we make enlarge_buffer friendly to the memory alloctor a bit?
>
> His problem is that the driver can't allocate 2 mB with the hardware
> limit 128 segments.
>
> enlarge_buffer tries to use ST_MAX_ORDER and if the allocation (256 kB
> page) fails, enlarge_buffer fails. It could try smaller order instead?
>
> Not tested at all.
>
>
> diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
> index 5b7388f..119544b 100644
> --- a/drivers/scsi/st.c
> +++ b/drivers/scsi/st.c
> @@ -3729,7 +3729,8 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm
> b_size = PAGE_SIZE<< order;
> } else {
> for (b_size = PAGE_SIZE, order = 0;
> - order< ST_MAX_ORDER&& b_size< new_size;
> + order< ST_MAX_ORDER&&
> + max_segs * (PAGE_SIZE<< order)< new_size;
> order++, b_size *= 2)
> ; /* empty */
> }
You are correct. The loop does not work at all as it should. Years ago,
the strategy was to start with as big blocks as possible to minimize the
number s/g segments. Nowadays the segments must be of same size and the
old logic is not applicable.
I have not tested the patch either but it looks correct.
Thanks for noticing this bug. I hope this helps the users. The question
about number of s/g segments is still valid for the direct i/o case but
that is optimization and not whether one can read/write.
Thanks,
Kai
next prev parent reply other threads:[~2010-12-03 14:59 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-28 19:15 After memory pressure: can't read from tape anymore Lukas Kolbe
2010-11-29 17:09 ` Kai Makisara
2010-11-30 13:31 ` Lukas Kolbe
2010-11-30 16:10 ` Boaz Harrosh
2010-11-30 16:23 ` Kai Makisara
2010-11-30 16:44 ` Boaz Harrosh
2010-11-30 17:04 ` Kai Makisara
2010-11-30 17:24 ` Boaz Harrosh
2010-11-30 19:53 ` Kai Makisara
2010-12-01 9:40 ` Lukas Kolbe
2010-12-02 11:17 ` Desai, Kashyap
2010-12-02 16:22 ` Kai Makisara
2010-12-02 18:14 ` Desai, Kashyap
2010-12-02 20:25 ` Kai Makisara
2010-12-05 10:44 ` Lukas Kolbe
2010-12-03 10:13 ` FUJITA Tomonori
2010-12-03 10:45 ` Desai, Kashyap
2010-12-03 11:11 ` FUJITA Tomonori
2010-12-02 10:01 ` Lukas Kolbe
2010-12-03 9:44 ` FUJITA Tomonori
2010-11-30 16:20 ` Kai Makisara
2010-12-01 17:06 ` Lukas Kolbe
2010-12-02 16:41 ` Kai Makisara
2010-12-06 7:59 ` Kai Makisara
2010-12-06 8:50 ` FUJITA Tomonori
2010-12-06 9:36 ` Lukas Kolbe
2010-12-06 11:34 ` Bjørn Mork
2010-12-08 14:19 ` Lukas Kolbe
2010-12-03 12:27 ` FUJITA Tomonori
2010-12-03 14:59 ` Kai Mäkisara [this message]
2010-12-03 15:06 ` James Bottomley
2010-12-03 17:03 ` Lukas Kolbe
2010-12-03 18:10 ` James Bottomley
2010-12-05 10:53 ` Lukas Kolbe
2010-12-05 12:16 ` FUJITA Tomonori
2010-12-14 20:35 ` Vladislav Bolkhovitin
2010-12-14 22:23 ` Stephen Hemminger
2010-12-15 16:27 ` Vladislav Bolkhovitin
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=4CF905D1.6050903@kolumbus.fi \
--to=kai.makisara@kolumbus.fi \
--cc=fujita.tomonori@lab.ntt.co.jp \
--cc=linux-scsi@vger.kernel.org \
--cc=lkolbe@techfak.uni-bielefeld.de \
/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