Source-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

CVS commit: src/sys/dev



Module Name:    src
Committed By:   rin
Date:           Tue Oct  5 08:01:05 UTC 2021

Modified Files:
        src/sys/dev/ata: ata.c ata_wdc.c atavar.h
        src/sys/dev/ic: ahcisata_core.c mvsata.c siisata.c wdc.c
        src/sys/dev/scsipi: atapi_wdc.c

Log Message:
PR kern/56403

Fix kernel freeze for wdc(4) variants with ATAC_CAP_NOIRQ:

(1) Change ata_xfer_ops:c_poll from void to int function. When it returns
    ATAPOLL_AGAIN, let ata_xfer_start() iterate itself again.

(2) Let wdc_ata_bio_poll() return ATAPOLL_AGAIN until ATA_ITSDONE is
    achieved.

A similar change has been made for mvsata(4) (see mvsata_bio_poll()),
and no functional changes for other devices.

This is how the drivers worked before jdolecek-ncq branch was merged.

Note that this changes are less likely to cause infinite recursion:

(1) wdc_ata_bio_intr() called from wdc_ata_bio_poll() asserts ATA_ITSDONE
    in its error handling paths via wdc_ata_bio_done().

(2) Return value from c_start (= wdc_ata_bio_start()) is checked in
    ata_xfer_start().

Therefore, errors encountered in ata_xfer_ops:c_poll and c_start routines
terminate the recursion for wdc(4). The situation is similar for mvsata(4).

Still, there is a possibility where ata_xfer_start() takes long time to
finish a normal operation. This can result in a delayed response for lower
priority interrupts. But, I've never observed such a situation, even when
heavy thrashing takes place for swap partition in wd(4).

"Go ahead" by jdolecek@.


To generate a diff of this commit:
cvs rdiff -u -r1.163 -r1.164 src/sys/dev/ata/ata.c
cvs rdiff -u -r1.119 -r1.120 src/sys/dev/ata/ata_wdc.c
cvs rdiff -u -r1.108 -r1.109 src/sys/dev/ata/atavar.h
cvs rdiff -u -r1.101 -r1.102 src/sys/dev/ic/ahcisata_core.c
cvs rdiff -u -r1.60 -r1.61 src/sys/dev/ic/mvsata.c
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/ic/siisata.c
cvs rdiff -u -r1.307 -r1.308 src/sys/dev/ic/wdc.c
cvs rdiff -u -r1.140 -r1.141 src/sys/dev/scsipi/atapi_wdc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.




Home | Main Index | Thread Index | Old Index