diff options
author | sos <sos@FreeBSD.org> | 2008-04-17 12:29:35 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2008-04-17 12:29:35 +0000 |
commit | b11f9dd52aac5645107b2d8cb24361e9495b17d6 (patch) | |
tree | b12f34c4c9498ff9f554b3fab04f8ac66236b802 /sys/dev/ata/ata-queue.c | |
parent | 3f4fde5950af141f4f874f9172842398de81e11d (diff) | |
download | FreeBSD-src-b11f9dd52aac5645107b2d8cb24361e9495b17d6.zip FreeBSD-src-b11f9dd52aac5645107b2d8cb24361e9495b17d6.tar.gz |
Go back to preallocating everything possible on init.
This avoids calling busdma in the request processing path which caused a traumatic performance degradation.
Allocation has be postponed to after we know how many devices we possible can have on portmulitpliers to save some space.
Diffstat (limited to 'sys/dev/ata/ata-queue.c')
-rw-r--r-- | sys/dev/ata/ata-queue.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-queue.c b/sys/dev/ata/ata-queue.c index e20f0d1..5152faa 100644 --- a/sys/dev/ata/ata-queue.c +++ b/sys/dev/ata/ata-queue.c @@ -119,10 +119,11 @@ int ata_controlcmd(device_t dev, u_int8_t command, u_int16_t feature, u_int64_t lba, u_int16_t count) { - struct ata_request *request = ata_alloc_request(dev); + struct ata_request *request = ata_alloc_request(); int error = ENOMEM; if (request) { + request->dev = dev; request->u.ata.command = command; request->u.ata.lba = lba; request->u.ata.count = count; @@ -141,11 +142,12 @@ int ata_atapicmd(device_t dev, u_int8_t *ccb, caddr_t data, int count, int flags, int timeout) { - struct ata_request *request = ata_alloc_request(dev); + struct ata_request *request = ata_alloc_request(); struct ata_device *atadev = device_get_softc(dev); int error = ENOMEM; if (request) { + request->dev = dev; if ((atadev->param.config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) bcopy(ccb, request->u.atapi.ccb, 12); else @@ -356,8 +358,8 @@ ata_completed(void *context, int dummy) "\4MEDIA_CHANGE_REQEST" "\3ABORTED\2NO_MEDIA\1ILLEGAL_LENGTH"); if ((request->flags & ATA_R_DMA) && - (request->dma.status & ATA_BMSTAT_ERROR)) - printf(" dma=0x%02x", request->dma.status); + (request->dma->status & ATA_BMSTAT_ERROR)) + printf(" dma=0x%02x", request->dma->status); if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) printf(" LBA=%ju", request->u.ata.lba); printf("\n"); |