linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* highmem pages
@ 2005-10-05  7:35 Jeff Garzik
  2005-10-06 10:35 ` Albert Lee
  0 siblings, 1 reply; 12+ messages in thread
From: Jeff Garzik @ 2005-10-05  7:35 UTC (permalink / raw)
  To: Albert Lee; +Cc: linux-ide@vger.kernel.org


Here is an interesting code snippet from ide-scsi, that could be useful 
in libata:

>                 count = min(pc->sg->length - pc->b_count, bcount);
>                 if (PageHighMem(pc->sg->page)) {
>                         unsigned long flags;
> 
>                         local_irq_save(flags);
>                         buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offse
> t;
>                         drive->hwif->atapi_input_bytes(drive, buf + pc->b_count,
>  count);
>                         kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
>                         local_irq_restore(flags);
>                 } else {
>                         buf = page_address(pc->sg->page) + pc->sg->offset;
>                         drive->hwif->atapi_input_bytes(drive, buf + pc->b_count,
>  count);
>                }


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: highmem pages
  2005-10-05  7:35 highmem pages Jeff Garzik
@ 2005-10-06 10:35 ` Albert Lee
  2005-10-06 10:40   ` [PATCH/RFC 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
                     ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-06 10:35 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Jeff Garzik wrote:
> 
> Here is an interesting code snippet from ide-scsi, that could be useful 
> in libata:
> 
>>                 count = min(pc->sg->length - pc->b_count, bcount);
>>                 if (PageHighMem(pc->sg->page)) {
>>                         unsigned long flags;
>>
>>                         local_irq_save(flags);
>>                         buf = kmap_atomic(pc->sg->page, KM_IRQ0) + 
>> pc->sg->offse
>> t;
>>                         drive->hwif->atapi_input_bytes(drive, buf + 
>> pc->b_count,
>>  count);
>>                         kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
>>                         local_irq_restore(flags);
>>                 } else {
>>                         buf = page_address(pc->sg->page) + 
>> pc->sg->offset;
>>                         drive->hwif->atapi_input_bytes(drive, buf + 
>> pc->b_count,
>>  count);
>>                }
> 

Thanks for the advice. The kmap_atomic() usage optimization patches are ready:

   patch 1/3: reorganize ata_pio_sector() and __atapi_pio_bytes()
   patch 2/3: reorganize "buf + offset"
   patch 3/3: use PageHighMem() to optimize the kmap_atomic() usage

Patch against libata-dev irq-pio branch (c71c18576d0d8aa4db876c737c3c597c724cf02f).
For your review and advice, thanks.

Albert



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH/RFC 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes()
  2005-10-06 10:35 ` Albert Lee
@ 2005-10-06 10:40   ` Albert Lee
  2005-10-06 10:42   ` [PATCH/RFC 2/3] irq-pio: reorganize "buf + offset" Albert Lee
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-06 10:40 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Patch 1/3:
   reorganize ata_pio_sector() and __atapi_pio_bytes()

Changes:
   - move some code out of the kmap_atomic() / kunmap_atomic() zone
   - remove the redundant "do_write = (qc->tf.flags & ATA_TFLAG_WRITE);"


For your review, thanks.

Albert
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>

===========

--- irq-pio/drivers/scsi/libata-core.c	2005-10-06 16:47:05.000000000 +0800
+++ himem1/drivers/scsi/libata-core.c	2005-10-06 15:59:35.000000000 +0800
@@ -2763,22 +2763,21 @@ static void ata_pio_sector(struct ata_qu
  	local_irq_save(flags);
  	buf = kmap_atomic(page, KM_IRQ0) + offset;

-	qc->cursect++;
-	qc->cursg_ofs++;
-
-	if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
-		qc->cursg++;
-		qc->cursg_ofs = 0;
-	}
-
  	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

  	/* do the actual data transfer */
-	do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
  	ata_data_xfer(ap, buf, ATA_SECT_SIZE, do_write);

  	kunmap_atomic(buf - offset, KM_IRQ0);
  	local_irq_restore(flags);
+
+	qc->cursect++;
+	qc->cursg_ofs++;
+
+	if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
+		qc->cursg++;
+		qc->cursg_ofs = 0;
+	}
  }

  /**
@@ -2956,6 +2955,14 @@ next_sg:
  	local_irq_save(flags);
  	buf = kmap_atomic(page, KM_IRQ0) + offset;

+	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
+
+	/* do the actual data transfer */
+	ata_data_xfer(ap, buf, count, do_write);
+
+	kunmap_atomic(buf - offset, KM_IRQ0);
+	local_irq_restore(flags);
+
  	bytes -= count;
  	qc->curbytes += count;
  	qc->cursg_ofs += count;
@@ -2965,14 +2972,6 @@ next_sg:
  		qc->cursg_ofs = 0;
  	}

-	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
-
-	/* do the actual data transfer */
-	ata_data_xfer(ap, buf, count, do_write);
-
-	kunmap_atomic(buf - offset, KM_IRQ0);
-	local_irq_restore(flags);
-
  	if (bytes)
  		goto next_sg;
  }



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH/RFC 2/3] irq-pio: reorganize "buf + offset"
  2005-10-06 10:35 ` Albert Lee
  2005-10-06 10:40   ` [PATCH/RFC 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
@ 2005-10-06 10:42   ` Albert Lee
  2005-10-06 10:44   ` [PATCH/RFC 3/3] " Albert Lee
  2005-10-06 11:20   ` highmem pages Jeff Garzik
  3 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-06 10:42 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Patch 2/3:
     reorganize "buf + offset" in ata_pio_sector() and __atapi_pio_bytes()


Changes:
   - relocate DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
   - buf + offset, buf - offset tidy up


For your review, thanks.

Albert
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>

===========

--- himem1/drivers/scsi/libata-core.c	2005-10-06 15:59:35.000000000 +0800
+++ himem2/drivers/scsi/libata-core.c	2005-10-06 16:10:33.000000000 +0800
@@ -2760,15 +2760,15 @@ static void ata_pio_sector(struct ata_qu
  	page = nth_page(page, (offset >> PAGE_SHIFT));
  	offset %= PAGE_SIZE;

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0) + offset;
-
  	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

+	local_irq_save(flags);
+	buf = kmap_atomic(page, KM_IRQ0);
+
  	/* do the actual data transfer */
-	ata_data_xfer(ap, buf, ATA_SECT_SIZE, do_write);
+	ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);

-	kunmap_atomic(buf - offset, KM_IRQ0);
+	kunmap_atomic(buf, KM_IRQ0);
  	local_irq_restore(flags);

  	qc->cursect++;
@@ -2952,15 +2952,15 @@ next_sg:
  	/* don't cross page boundaries */
  	count = min(count, (unsigned int)PAGE_SIZE - offset);

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0) + offset;
-
  	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

+	local_irq_save(flags);
+	buf = kmap_atomic(page, KM_IRQ0);
+
  	/* do the actual data transfer */
-	ata_data_xfer(ap, buf, count, do_write);
+	ata_data_xfer(ap, buf + offset, count, do_write);

-	kunmap_atomic(buf - offset, KM_IRQ0);
+	kunmap_atomic(buf, KM_IRQ0);
  	local_irq_restore(flags);

  	bytes -= count;



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH/RFC 3/3] irq-pio: reorganize "buf + offset"
  2005-10-06 10:35 ` Albert Lee
  2005-10-06 10:40   ` [PATCH/RFC 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
  2005-10-06 10:42   ` [PATCH/RFC 2/3] irq-pio: reorganize "buf + offset" Albert Lee
@ 2005-10-06 10:44   ` Albert Lee
  2005-10-06 11:20   ` highmem pages Jeff Garzik
  3 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-06 10:44 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Patch 3/3:
   use PageHighMem() to optimize the kmap_atomic() usage, as done in ide-scsi.c

For your review, thanks.

Albert
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>

==========

--- himem2/drivers/scsi/libata-core.c	2005-10-06 16:10:33.000000000 +0800
+++ himem3/drivers/scsi/libata-core.c	2005-10-06 16:08:43.000000000 +0800
@@ -2748,7 +2748,6 @@ static void ata_pio_sector(struct ata_qu
  	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,14 +2761,21 @@ static void ata_pio_sector(struct ata_qu

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

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0);
+	if (PageHighMem(page)) {
+		unsigned long flags;
+
+		local_irq_save(flags);
+		buf = kmap_atomic(page, KM_IRQ0);

-	/* do the actual data transfer */
-	ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);
+		/* do the actual data transfer */
+		ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);

-	kunmap_atomic(buf, KM_IRQ0);
-	local_irq_restore(flags);
+		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
  	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,14 +2959,21 @@ next_sg:

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

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0);
+	if (PageHighMem(page)) {
+		unsigned long flags;
+
+		local_irq_save(flags);
+		buf = kmap_atomic(page, KM_IRQ0);

-	/* do the actual data transfer */
-	ata_data_xfer(ap, buf + offset, count, do_write);
+		/* do the actual data transfer */
+		ata_data_xfer(ap, buf + offset, count, do_write);

-	kunmap_atomic(buf, KM_IRQ0);
-	local_irq_restore(flags);
+		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;



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: highmem pages
  2005-10-06 10:35 ` Albert Lee
                     ` (2 preceding siblings ...)
  2005-10-06 10:44   ` [PATCH/RFC 3/3] " Albert Lee
@ 2005-10-06 11:20   ` Jeff Garzik
  2005-10-07  6:00     ` Albert Lee
                       ` (4 more replies)
  3 siblings, 5 replies; 12+ messages in thread
From: Jeff Garzik @ 2005-10-06 11:20 UTC (permalink / raw)
  To: Albert Lee
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Albert Lee wrote:
> Thanks for the advice. The kmap_atomic() usage optimization patches are 
> ready:
> 
>   patch 1/3: reorganize ata_pio_sector() and __atapi_pio_bytes()
>   patch 2/3: reorganize "buf + offset"
>   patch 3/3: use PageHighMem() to optimize the kmap_atomic() usage

Thanks for the patches.  All three patches look OK, but did not apply 
(probably due to mailer problems):

> [jgarzik@pretzel libata-dev]$ patch -sp1 < /g/tmp/mbox 
> 3 out of 3 hunks FAILED -- saving rejects to file drivers/scsi/libata-core.c.rej

FWIW the most reliable email solution is to use a script to generate an 
RFC822 header and email message:

	To: jgarzik@pobox.com (Jeff Garzik)
	CC: linux-ide@vger.kernel.org (Linux IDE mailing list)
	Subject: [patch 1/3] irq-pio: ...
	[blank line, as required by RFC822]
	[patch description]
	[patch]

and then send that to '/usr/bin/sendmail -t < msg.txt' for delivery.

	Jeff



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: highmem pages
  2005-10-06 11:20   ` highmem pages Jeff Garzik
@ 2005-10-07  6:00     ` Albert Lee
  2005-10-07  6:08     ` [PATCH 0/3] libata-dev: use PageHighMem() to optimize kmap_atomic() usage Albert Lee
                       ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-07  6:00 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Jeff Garzik wrote:
> Albert Lee wrote:
> 
>> Thanks for the advice. The kmap_atomic() usage optimization patches
>> are ready:
>>
>>   patch 1/3: reorganize ata_pio_sector() and __atapi_pio_bytes()
>>   patch 2/3: reorganize "buf + offset"
>>   patch 3/3: use PageHighMem() to optimize the kmap_atomic() usage
> 
> 
> Thanks for the patches.  All three patches look OK, but did not apply
> (probably due to mailer problems):
> 
>> [jgarzik@pretzel libata-dev]$ patch -sp1 < /g/tmp/mbox 3 out of 3
>> hunks FAILED -- saving rejects to file drivers/scsi/libata-core.c.rej
> 
> 

Sorry for the mangled patch. :(

It seems Thunderbird add an extra space to the beginning of the line.
e.g.
[space][tab]local_irq_save(flags);
was changed to
[space][space][tab]local_irq_save(flags);

I've reconfigured the Thunderbird according to

http://www.gelato.unsw.edu.au/archives/git/0508/7750.html

Will resubmit the patches later.

Albert


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 0/3] libata-dev: use PageHighMem() to optimize kmap_atomic() usage
  2005-10-06 11:20   ` highmem pages Jeff Garzik
  2005-10-07  6:00     ` Albert Lee
@ 2005-10-07  6:08     ` Albert Lee
  2005-10-07  6:12     ` [PATCH 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
                       ` (2 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-07  6:08 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Doug Maxey, Bartlomiej Zolnierkiewicz

(Resend due to white space mangled in the previous patches)

   patch 1/3: reorganize ata_pio_sector() and __atapi_pio_bytes()
   patch 2/3: reorganize "buf + offset"
   patch 3/3: use PageHighMem() to optimize the kmap_atomic() usage

Patch against libata-dev irq-pio branch (c71c18576d0d8aa4db876c737c3c597c724cf02f).
Thanks,

Albert




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes()
  2005-10-06 11:20   ` highmem pages Jeff Garzik
  2005-10-07  6:00     ` Albert Lee
  2005-10-07  6:08     ` [PATCH 0/3] libata-dev: use PageHighMem() to optimize kmap_atomic() usage Albert Lee
@ 2005-10-07  6:12     ` Albert Lee
  2005-10-07  6:18     ` [PATCH 2/3] irq-pio: reorganize "buf + offset" Albert Lee
  2005-10-07  6:20     ` [PATCH 3/3] irq-pio: use PageHighMem() to optimize the kmap_atomic() usage Albert Lee
  4 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-07  6:12 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

Patch 1/3:
   reorganize ata_pio_sector() and __atapi_pio_bytes()

Changes:
   - move some code out of the kmap_atomic() / kunmap_atomic() zone
   - remove the redundant "do_write = (qc->tf.flags & ATA_TFLAG_WRITE);"


Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
===========

--- irq-pio/drivers/scsi/libata-core.c	2005-10-06 16:47:05.000000000 +0800
+++ himem1/drivers/scsi/libata-core.c	2005-10-06 15:59:35.000000000 +0800
@@ -2763,22 +2763,21 @@ static void ata_pio_sector(struct ata_qu
 	local_irq_save(flags);
 	buf = kmap_atomic(page, KM_IRQ0) + offset;

-	qc->cursect++;
-	qc->cursg_ofs++;
-
-	if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
-		qc->cursg++;
-		qc->cursg_ofs = 0;
-	}
-
 	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

 	/* do the actual data transfer */
-	do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
 	ata_data_xfer(ap, buf, ATA_SECT_SIZE, do_write);

 	kunmap_atomic(buf - offset, KM_IRQ0);
 	local_irq_restore(flags);
+
+	qc->cursect++;
+	qc->cursg_ofs++;
+
+	if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
+		qc->cursg++;
+		qc->cursg_ofs = 0;
+	}
 }

 /**
@@ -2956,6 +2955,14 @@ next_sg:
 	local_irq_save(flags);
 	buf = kmap_atomic(page, KM_IRQ0) + offset;

+	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
+
+	/* do the actual data transfer */
+	ata_data_xfer(ap, buf, count, do_write);
+
+	kunmap_atomic(buf - offset, KM_IRQ0);
+	local_irq_restore(flags);
+
 	bytes -= count;
 	qc->curbytes += count;
 	qc->cursg_ofs += count;
@@ -2965,14 +2972,6 @@ next_sg:
 		qc->cursg_ofs = 0;
 	}

-	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
-
-	/* do the actual data transfer */
-	ata_data_xfer(ap, buf, count, do_write);
-
-	kunmap_atomic(buf - offset, KM_IRQ0);
-	local_irq_restore(flags);
-
 	if (bytes)
 		goto next_sg;
 }



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 2/3] irq-pio: reorganize "buf + offset"
  2005-10-06 11:20   ` highmem pages Jeff Garzik
                       ` (2 preceding siblings ...)
  2005-10-07  6:12     ` [PATCH 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
@ 2005-10-07  6:18     ` Albert Lee
  2005-10-07  6:20     ` [PATCH 3/3] irq-pio: use PageHighMem() to optimize the kmap_atomic() usage Albert Lee
  4 siblings, 0 replies; 12+ messages in thread
From: Albert Lee @ 2005-10-07  6:18 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

(Resend)
Patch 2/3:
     reorganize "buf + offset" in ata_pio_sector() and __atapi_pio_bytes()


Changes:
   - relocate DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
   - buf + offset, buf - offset tidy up


Signed-off-by: Albert Lee <albertcc@tw.ibm.com>

===========

--- himem1/drivers/scsi/libata-core.c	2005-10-06 15:59:35.000000000 +0800
+++ himem2/drivers/scsi/libata-core.c	2005-10-06 16:10:33.000000000 +0800
@@ -2760,15 +2760,15 @@ static void ata_pio_sector(struct ata_qu
 	page = nth_page(page, (offset >> PAGE_SHIFT));
 	offset %= PAGE_SIZE;

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0) + offset;
-
 	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

+	local_irq_save(flags);
+	buf = kmap_atomic(page, KM_IRQ0);
+
 	/* do the actual data transfer */
-	ata_data_xfer(ap, buf, ATA_SECT_SIZE, do_write);
+	ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);

-	kunmap_atomic(buf - offset, KM_IRQ0);
+	kunmap_atomic(buf, KM_IRQ0);
 	local_irq_restore(flags);

 	qc->cursect++;
@@ -2952,15 +2952,15 @@ next_sg:
 	/* don't cross page boundaries */
 	count = min(count, (unsigned int)PAGE_SIZE - offset);

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0) + offset;
-
 	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");

+	local_irq_save(flags);
+	buf = kmap_atomic(page, KM_IRQ0);
+
 	/* do the actual data transfer */
-	ata_data_xfer(ap, buf, count, do_write);
+	ata_data_xfer(ap, buf + offset, count, do_write);

-	kunmap_atomic(buf - offset, KM_IRQ0);
+	kunmap_atomic(buf, KM_IRQ0);
 	local_irq_restore(flags);

 	bytes -= count;



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 3/3] irq-pio: use PageHighMem() to optimize the kmap_atomic() usage
  2005-10-06 11:20   ` highmem pages Jeff Garzik
                       ` (3 preceding siblings ...)
  2005-10-07  6:18     ` [PATCH 2/3] irq-pio: reorganize "buf + offset" Albert Lee
@ 2005-10-07  6:20     ` Albert Lee
  2005-10-09 13:49       ` Jeff Garzik
  4 siblings, 1 reply; 12+ messages in thread
From: Albert Lee @ 2005-10-07  6:20 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

(resend)
Patch 3/3:
   use PageHighMem() to optimize the kmap_atomic() usage, as done in ide-scsi.c

Signed-off-by: Albert Lee <albertcc@tw.ibm.com>

==========

--- himem2/drivers/scsi/libata-core.c	2005-10-06 16:10:33.000000000 +0800
+++ himem3/drivers/scsi/libata-core.c	2005-10-06 16:08:43.000000000 +0800
@@ -2748,7 +2748,6 @@ static void ata_pio_sector(struct ata_qu
 	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,14 +2761,21 @@ static void ata_pio_sector(struct ata_qu

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

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0);
+	if (PageHighMem(page)) {
+		unsigned long flags;
+
+		local_irq_save(flags);
+		buf = kmap_atomic(page, KM_IRQ0);

-	/* do the actual data transfer */
-	ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);
+		/* do the actual data transfer */
+		ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);

-	kunmap_atomic(buf, KM_IRQ0);
-	local_irq_restore(flags);
+		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
 	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,14 +2959,21 @@ next_sg:

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

-	local_irq_save(flags);
-	buf = kmap_atomic(page, KM_IRQ0);
+	if (PageHighMem(page)) {
+		unsigned long flags;
+
+		local_irq_save(flags);
+		buf = kmap_atomic(page, KM_IRQ0);

-	/* do the actual data transfer */
-	ata_data_xfer(ap, buf + offset, count, do_write);
+		/* do the actual data transfer */
+		ata_data_xfer(ap, buf + offset, count, do_write);

-	kunmap_atomic(buf, KM_IRQ0);
-	local_irq_restore(flags);
+		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;



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] irq-pio: use PageHighMem() to optimize the kmap_atomic() usage
  2005-10-07  6:20     ` [PATCH 3/3] irq-pio: use PageHighMem() to optimize the kmap_atomic() usage Albert Lee
@ 2005-10-09 13:49       ` Jeff Garzik
  0 siblings, 0 replies; 12+ messages in thread
From: Jeff Garzik @ 2005-10-09 13:49 UTC (permalink / raw)
  To: Albert Lee
  Cc: linux-ide@vger.kernel.org, Bartlomiej Zolnierkiewicz, Doug Maxey

applied patches 1-3, after updating the irq-pio branch to the latest 
upstream branch.


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2005-10-09 13:49 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-10-05  7:35 highmem pages Jeff Garzik
2005-10-06 10:35 ` Albert Lee
2005-10-06 10:40   ` [PATCH/RFC 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
2005-10-06 10:42   ` [PATCH/RFC 2/3] irq-pio: reorganize "buf + offset" Albert Lee
2005-10-06 10:44   ` [PATCH/RFC 3/3] " Albert Lee
2005-10-06 11:20   ` highmem pages Jeff Garzik
2005-10-07  6:00     ` Albert Lee
2005-10-07  6:08     ` [PATCH 0/3] libata-dev: use PageHighMem() to optimize kmap_atomic() usage Albert Lee
2005-10-07  6:12     ` [PATCH 1/3] irq-pio: reorganize ata_pio_sector() and __atapi_pio_bytes() Albert Lee
2005-10-07  6:18     ` [PATCH 2/3] irq-pio: reorganize "buf + offset" Albert Lee
2005-10-07  6:20     ` [PATCH 3/3] irq-pio: use PageHighMem() to optimize the kmap_atomic() usage Albert Lee
2005-10-09 13:49       ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).