summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-queue.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2008-04-17 12:29:35 +0000
committersos <sos@FreeBSD.org>2008-04-17 12:29:35 +0000
commitb11f9dd52aac5645107b2d8cb24361e9495b17d6 (patch)
treeb12f34c4c9498ff9f554b3fab04f8ac66236b802 /sys/dev/ata/ata-queue.c
parent3f4fde5950af141f4f874f9172842398de81e11d (diff)
downloadFreeBSD-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.c10
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");
OpenPOWER on IntegriCloud