From: Mark Lord <liml@rtr.ca>
To: Fajun Chen <fajunchen@gmail.com>
Cc: "linux-ide@vger.kernel.org" <linux-ide@vger.kernel.org>,
linux-scsi@vger.kernel.org, Tejun Heo <htejun@gmail.com>
Subject: Re: Process Scheduling Issue using sg/libata
Date: Sat, 17 Nov 2007 11:25:05 -0500 [thread overview]
Message-ID: <473F15E1.5030601@rtr.ca> (raw)
In-Reply-To: <8202f4270711162320s2eb1d48dwb1430f4a779809a9@mail.gmail.com>
Fajun Chen wrote:
> On 11/16/07, Mark Lord <liml@rtr.ca> wrote:
>> Fajun Chen wrote:
>>> Hi All,
>>>
>>> I use sg/libata and ata pass through for read/writes. Linux 2.6.18-rc2
>>> and libata version 2.00 are loaded on ARM XScale board. Under heavy
>>> cpu load (e.g. when blocks per transfer/sector count is set to 1),
>>> I've observed that the test application can suck cpu away for long
>>> time (more than 20 seconds) and other processes including high
>>> priority shell can not get the time slice to run. What's interesting
>>> is that if the application is under heavy IO load (e.g. when blocks
>>> per transfer/sector count is set to 256), the problem goes away. I
>>> also tested with open source code sg_utils and got the same result, so
>>> this is not a problem specific to my user-space application.
>> ..
>>
>> Post the relevant code here, and then we'll be able to better understand
>> and explain it to you.
>>
>> For example, if the code is using ATA opcodes 0x20, 0x21, 0x24,
>> 0x30, 0x31, 0x34, 0x29, 0x39, 0xc4 or 0xc5 (any of the R/W PIO ops),
>> then this behaviour does not surprise me in the least. Fully expected
>> and difficult to avoid.
>>
>
> This problem also happens with R/W DMA ops. Below are simplified code snippets:
> // Open one sg device for read
> if ((sg_fd = open(dev_name, O_RDWR))<0)
> {
> ...
> }
> read_buffer = (U8 *)mmap(NULL, buf_sz, PROT_READ | PROT_WRITE,
> MAP_SHARED, sg_fd, 0);
>
> // Open the same sg device for write
> if ((sg_fd_wr = open(dev_name, O_RDWR))<0)
> {
> ...
> }
> write_buffer = (U8 *)mmap(NULL, buf_sz, PROT_READ | PROT_WRITE,
> MAP_SHARED, sg_fd_wr, 0);
..
Mmmm.. what is the purpose of those two mmap'd areas ?
I think this is important and relevant here: what are they used for?
As coded above, these are memory mapped areas taht (1) overlap,
and (2) will be demand paged automatically to/from the disk
as they are accessed/modified. This *will* conflict with any SG_IO
operations happening at the same time on the same device.
????
> sg_io_hdr_t io_hdr;
>
> memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
>
> io_hdr.interface_id = 'S';
> io_hdr.mx_sb_len = sizeof(sense_buffer);
> io_hdr.sbp = sense_buffer;
> io_hdr.dxfer_len = dxfer_len;
> io_hdr.cmd_len = cmd_len;
> io_hdr.cmdp = cmdp; // ATA pass through command block
> io_hdr.timeout = cmd_tmo * 1000; // In millisecs
> io_hdr.pack_id = id; // Read/write counter for now
> io_hdr.iovec_count=0; // scatter gather elements, 0=not being used
>
> if (direction == 1)
> {
> io_hdr.dxfer_direction = SG_DXFER_TO_DEV;
> io_hdr.flags |= SG_FLAG_MMAP_IO;
> status = ioctl(sg_fd_wr, SG_IO, &io_hdr);
> }
> else
> {
> io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
> io_hdr.flags |= SG_FLAG_MMAP_IO;
> status = ioctl(sg_fd, SG_IO, &io_hdr);
> }
> ...
> Mmaped IO is a moot point here since this problem is also observed
> when using direct IO.
>
> Thanks,
> Fajun
next prev parent reply other threads:[~2007-11-17 16:25 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-17 0:49 Process Scheduling Issue using sg/libata Fajun Chen
2007-11-17 3:02 ` Tejun Heo
2007-11-17 6:14 ` Fajun Chen
2007-11-17 17:13 ` James Chapman
2007-11-17 19:37 ` Fajun Chen
2007-11-17 4:30 ` Mark Lord
2007-11-17 7:20 ` Fajun Chen
2007-11-17 16:25 ` Mark Lord [this message]
2007-11-17 19:20 ` Fajun Chen
2007-11-17 19:55 ` Mark Lord
2007-11-18 6:48 ` Fajun Chen
2007-11-18 14:32 ` Mark Lord
2007-11-18 19:14 ` Fajun Chen
2007-11-18 19:54 ` Mark Lord
2007-11-18 22:29 ` Fajun Chen
2007-11-18 23:07 ` Mark Lord
2007-11-19 16:40 ` James Chapman
2007-11-19 16:51 ` Tejun Heo
2007-11-19 17:17 ` Alan Cox
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=473F15E1.5030601@rtr.ca \
--to=liml@rtr.ca \
--cc=fajunchen@gmail.com \
--cc=htejun@gmail.com \
--cc=linux-ide@vger.kernel.org \
--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;
as well as URLs for NNTP newsgroup(s).