Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91b8b313 authored by Albert Lee's avatar Albert Lee Committed by Jeff Garzik
Browse files

[libata irq-pio] use PageHighMem() to optimize the kmap_atomic() usage


as done in ide-scsi.c

Signed-off-by: default avatarAlbert Lee <albertcc@tw.ibm.com>
parent 083958d3
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -2748,7 +2748,6 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
	struct page *page;
	unsigned int offset;
	unsigned char *buf;
	unsigned long flags;

	if (qc->cursect == (qc->nsect - 1))
		ap->hsm_task_state = HSM_ST_LAST;
@@ -2762,6 +2761,9 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)

	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

	if (PageHighMem(page)) {
		unsigned long flags;

		local_irq_save(flags);
		buf = kmap_atomic(page, KM_IRQ0);

@@ -2770,6 +2772,10 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)

		kunmap_atomic(buf, KM_IRQ0);
		local_irq_restore(flags);
	} else {
		buf = page_address(page);
		ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);
	}

	qc->cursect++;
	qc->cursg_ofs++;
@@ -2908,7 +2914,6 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
	struct page *page;
	unsigned char *buf;
	unsigned int offset, count;
	unsigned long flags;

	if (qc->curbytes + bytes >= qc->nbytes)
		ap->hsm_task_state = HSM_ST_LAST;
@@ -2954,6 +2959,9 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)

	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

	if (PageHighMem(page)) {
		unsigned long flags;

		local_irq_save(flags);
		buf = kmap_atomic(page, KM_IRQ0);

@@ -2962,6 +2970,10 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)

		kunmap_atomic(buf, KM_IRQ0);
		local_irq_restore(flags);
	} else {
		buf = page_address(page);
		ata_data_xfer(ap, buf + offset, count, do_write);
	}

	bytes -= count;
	qc->curbytes += count;