Re: ATA Patch #7 (Re: ATA Patch #6)
--QKdGvSO+nmPlgiQ/
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Tue, Nov 30, 2004 at 10:45:43AM -0800, Matthew Dillon wrote:
> :Here's another patch to be applied on top of ATA Patch #7(attached).
> :I added ata_clear_interlock() in ata_dmastart() because it needs
> :device interrupt enabled anyway. Here I'm assuming that the critical
> :section can be nested(looking at thread2.h it can).
> :Command-start delay can be changed via hw.ata.command_delay(default: 10).
> :Negative value is ignored and silently reset to 0 (can we let sysctl(8)
> :to reject bogus values?).
>
> You can use SYSCTL_PROC to control allowed values, but it may be
> easier just to leave it SYSCTL_INT and check at DELAY time, e.g.:
>
> delay = blahdelay;
> if (delay < 1)
> delay = 1;
> if (delay > 1000)
> delay = 1000;
> DELAY(delay);
I took this way, but allowing the blahdelay to be zero(in which case
DELAY() isn't called). I also made selection delay tunable, and made
two delays tunable int's so that I can put it in the /boot/loader.conf
hw.ata.command_delay=0
hw.ata.selection_delay=0
(it works on all of my DragonFly machines, but not sure on other machines)
They both default to 10 for safety, but these DELAY()'s seem to have bigger
impact on performance on slower machines. Does command-start delay really
need to be 10us(=10000ns) which is far too larger than the required 400ns
and taking into account the number of instructions between ATA_OUTB()
and ATA_INB()?
> We are going to have to clean up the ata_clear_interlock() calls...
> we do not want to reenable the interlock in situations where no
> interrupt is required to complete the command because otherwise
> if an interrupt does occur the system can livelock because we no
> longer unconditionally read the status register if we dont think the
> interrupt is valid.
>
> e.g. there are a bunch of places where you added ata_clear_interlock()
> where you shouldn't have. Most of those need to be backed out. We
> *ONLY* clear the interlock and enable the interrupt if the operation
> is one which requires an interrupt to complete.
Yes, it turned out that ata_clear_interlock() I added in the previous
patch were unnecessary, and only ones following ata_dmastart() should
have been moved.
> Here is a posit... if writing to ALTSTATUS (which controls IDS and
> other bits) is illegal during DMAC, is reading STATUS or ALTSTATUS
> also illegal during DMAC? The spec seems to indicate that it is
> not illegal but I'm beginning to think that it may be.
> If it is then we need to add more code to the interrupt handler, though
> I'm not sure exactly what we would be able to do.. I guess we could
> check the DMA controller to see if it indicates that DMA has completed,
> but that doesn't help us with the ATA_S_ERROR case.
I don't know about that.. Alternate Status register and Device Control register
are just two separate registers sharing the same address, so I don't think
the same access restriction as Device Control register applies to Alternate
Status register. But it may depend on controllers.
> I've synchronized with your patch-7-take-2 so lets form a new basis
> relative to that. Could you take another pass at the interlock calls
> you added and remove the ones for situations where no completion
> interrupt is expected?
Thanks, attached(a diff against CVS-HEAD).
Unfortunately, none of ATA Patch #7, #7 + patch-7-take2, or the patch
attached to this message worked on a desktop in my office. It's has
a PentiumIV 1.7GHz running SMP kernel(but HTT is unavailable). No timer
problem, and not using TIMER_USE_1.
It frequently timed out trying to identify the media in the CD-ROM drive,
or when writing to the harddrive. Reading from the harddrive also timed
out, but only once or so at the beginning.
Inserting DELAY()'s after the call to ata_clear_interlock() seemed to
reduce the number of timeouts, but it wasn't quite reproducible.
Increasing or decreaing command_delay or selection_delay seemed to have
little to do with the timeout. Sigh. I'll try a UP kernel later to see
if running an SMP kernel has something to do with this.
--QKdGvSO+nmPlgiQ/
Content-Type: application/x-gunzip
Content-Disposition: attachment; filename="ata-9.patch.gz"
Content-Transfer-Encoding: base64
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
nUhkcwAA
--QKdGvSO+nmPlgiQ/--
討論串 (同標題文章)
完整討論串 (本文為第 5 之 6 篇):