Patchwork DMA doesn't work since "make ata port as parent device of scsi host"

login
register
mail settings
Submitter Lin Ming
Date March 21, 2012, 1:25 a.m.
Message ID <1332293133.17160.12.camel@minggr>
Download mbox | patch
Permalink /patch/147892/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Lin Ming - March 21, 2012, 1:25 a.m.
On Thu, 2012-03-15 at 16:59 +0100, Jörg Sommer wrote:
> Lin Ming hat am Thu 15. Mar, 16:19 (+0800) geschrieben:
> > On Thu, 2012-03-15 at 08:48 +0100, Jörg Sommer wrote:
> > > Lin Ming hat am Thu 15. Mar, 11:26 (+0800) geschrieben:
> > > > On Thu, 2012-03-15 at 09:59 +0800, Lin Ming wrote:
> > > > > On Thu, 2012-03-15 at 02:48 +0100, Jörg Sommer wrote:
> > > > > > Hi,
> > > > > > 
> > > > > > I'm getting these messages in a KVM virtualized host and the access to
> > > > > > the disks is very slow. Using libata.dma=0 suppresses the warnings, but
> > > > > > the disks are still slow.
> > > > > 
> > > > > Hi Jörg,
> > > > > 
> > > > > Let me try to reproduce this issue first.
> > > > 
> > > > I tried below commands on x86_32, but can't reproduce it.
> > > > 
> > > > qemu-system-i386 -kernel /root/vmlinuz-3.3.0-rc7 -append "root=/dev/sda1
> > > > zcache" -hda /root/debian-32.img -hdb /root/data.img
> > > > 
> > > > Maybe because i386 uses different ata controller than ppc(ata_piix vs
> > > > pata-macio).
> > > > 
> > > > I'll try qemu-system-ppc.
> > > > 
> > > > Did you need to run some workload to trigger these warings?
> > > > Or did you get these warnings right after booting the VM?
> > > 
> > > These warnings come up before »INIT started«. I don't have to do
> > > anything, just wait and see.
> > > 
> > > # truncate -s100M /mnt/data/new
> > > # mke2fs -Fq /mnt/data/new
> > > # mount -o loop /mnt/data/new /mnt/other
> > > # cp --parents /bin/zsh-static /mnt/other/zsh
> > > # umount /mnt/other
> > > # qemu-system-ppc -enable-kvm -M mac99 -cpu G4 -k de -kernel /boot/vmlinuz-3.3.0-rc5-04520-g8d233c0 -append 'root=/dev/sda ro console=ttyPZ0 init=/zsh' -hda /mnt/data/new
> > > 
> > > I've uploaded my config and the kernel:
> > > http://alioth.debian.org/~jo-guest/config-3.3.0-rc5-04520-g8d233c0
> > > http://alioth.debian.org/~jo-guest/vmlinuz-3.3.0-rc5-04520-g8d233c0
> > > 
> > > You have to switch to the serial console (Ctrl-Alt-3 or with -nographic
> > > Ctrl-a c). All kernel messages arrive there.
> > > 
> > > > Would you please try to disable ata port runtime pm?
> > > > You can disable it by, for example,
> > > 
> > > Is this also possible with a kernel parameter? It takes very long until I
> > > get a shell prompt.
> > 
> > No, but you can try below debug patch to disable port runtime pm.
> > 
> > diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c
> > index 74aaee3..8def3fc 100644
> > --- a/drivers/ata/libata-transport.c
> > +++ b/drivers/ata/libata-transport.c
> > @@ -293,7 +293,6 @@ int ata_tport_add(struct device *parent,
> >  
> >  	device_enable_async_suspend(dev);
> >  	pm_runtime_set_active(dev);
> > -	pm_runtime_enable(dev);
> 
> This patch doesn't change anything. The kernel still hangs. If you have
> more patches or ideas, let me know.

Hi, 

Below patch should fix the problem.

Could you help to test it?

From a36022015c97c9a9f80e71b4283f0ff5f481ffc3 Mon Sep 17 00:00:00 2001
From: Lin Ming <ming.m.lin@intel.com>
Date: Tue, 20 Mar 2012 14:35:10 +0800
Subject: [PATCH] [SCSI] scsi_lib: use correct DMA device in __scsi_alloc_queue

Currently, __scsi_alloc_queue uses SCSI host's parent device
as DMA device to set segment boundary. But the parent device may not
refer to the DMA device. For example, for ATA disk, SCSI host's parent
device now refers to ATA port.

Since commit d139b9b([SCSI] scsi_lib_dma: fix bug with dma maps on
nested scsi objects), a new field Scsi_Host->dma_device was introduced
to refer to the real DMA device.

Use ->dma_device in __scsi_alloc_queue to correctly set segment
boundary.

And use scsi_add_host_with_dma in ata_scsi_add_hosts to pass in the
correct DMA device.

Signed-off-by: Lin Ming <ming.m.lin@intel.com>
---
 drivers/ata/libata-scsi.c |    3 ++-
 drivers/scsi/scsi_lib.c   |    2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)
Jörg Sommer - March 21, 2012, 7:40 p.m.
Lin Ming hat am Wed 21. Mar, 09:25 (+0800) geschrieben:
> On Thu, 2012-03-15 at 16:59 +0100, Jörg Sommer wrote:
> > Lin Ming hat am Thu 15. Mar, 16:19 (+0800) geschrieben:
> > > On Thu, 2012-03-15 at 08:48 +0100, Jörg Sommer wrote:
> > > > Lin Ming hat am Thu 15. Mar, 11:26 (+0800) geschrieben:
> > > > > On Thu, 2012-03-15 at 09:59 +0800, Lin Ming wrote:
> > > > > > On Thu, 2012-03-15 at 02:48 +0100, Jörg Sommer wrote:
> > > > > > > Hi,
> > > > > > > 
> > > > > > > I'm getting these messages in a KVM virtualized host and the access to
> > > > > > > the disks is very slow. Using libata.dma=0 suppresses the warnings, but
> > > > > > > the disks are still slow.
> > > > > > 
> > > > > > Hi Jörg,
> > > > > > 
> > > > > > Let me try to reproduce this issue first.
> > > > > 
> > > > > I tried below commands on x86_32, but can't reproduce it.
> > > > > 
> > > > > qemu-system-i386 -kernel /root/vmlinuz-3.3.0-rc7 -append "root=/dev/sda1
> > > > > zcache" -hda /root/debian-32.img -hdb /root/data.img
> > > > > 
> > > > > Maybe because i386 uses different ata controller than ppc(ata_piix vs
> > > > > pata-macio).
> > > > > 
> > > > > I'll try qemu-system-ppc.
> > > > > 
> > > > > Did you need to run some workload to trigger these warings?
> > > > > Or did you get these warnings right after booting the VM?
> > > > 
> > > > These warnings come up before »INIT started«. I don't have to do
> > > > anything, just wait and see.
> > > > 
> > > > # truncate -s100M /mnt/data/new
> > > > # mke2fs -Fq /mnt/data/new
> > > > # mount -o loop /mnt/data/new /mnt/other
> > > > # cp --parents /bin/zsh-static /mnt/other/zsh
> > > > # umount /mnt/other
> > > > # qemu-system-ppc -enable-kvm -M mac99 -cpu G4 -k de -kernel /boot/vmlinuz-3.3.0-rc5-04520-g8d233c0 -append 'root=/dev/sda ro console=ttyPZ0 init=/zsh' -hda /mnt/data/new
> > > > 
> > > > I've uploaded my config and the kernel:
> > > > http://alioth.debian.org/~jo-guest/config-3.3.0-rc5-04520-g8d233c0
> > > > http://alioth.debian.org/~jo-guest/vmlinuz-3.3.0-rc5-04520-g8d233c0
> > > > 
> > > > You have to switch to the serial console (Ctrl-Alt-3 or with -nographic
> > > > Ctrl-a c). All kernel messages arrive there.
> > > > 

> Hi, 
> 
> Below patch should fix the problem.
> 
> Could you help to test it?

Yes, it does. The kernel doesn't hang at bootup. Thanks for you
investigation.

> >From a36022015c97c9a9f80e71b4283f0ff5f481ffc3 Mon Sep 17 00:00:00 2001
> From: Lin Ming <ming.m.lin@intel.com>
> Date: Tue, 20 Mar 2012 14:35:10 +0800
> Subject: [PATCH] [SCSI] scsi_lib: use correct DMA device in __scsi_alloc_queue
> 
> Currently, __scsi_alloc_queue uses SCSI host's parent device
> as DMA device to set segment boundary. But the parent device may not
> refer to the DMA device. For example, for ATA disk, SCSI host's parent
> device now refers to ATA port.
> 
> Since commit d139b9b([SCSI] scsi_lib_dma: fix bug with dma maps on
> nested scsi objects), a new field Scsi_Host->dma_device was introduced
> to refer to the real DMA device.
> 
> Use ->dma_device in __scsi_alloc_queue to correctly set segment
> boundary.
> 
> And use scsi_add_host_with_dma in ata_scsi_add_hosts to pass in the
> correct DMA device.
> 
> Signed-off-by: Lin Ming <ming.m.lin@intel.com>

Tested-by: Jörg Sommer <joerg@alea.gnuu.de>

> ---
>  drivers/ata/libata-scsi.c |    3 ++-
>  drivers/scsi/scsi_lib.c   |    2 +-
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
> index 7ae1e77..e47f889 100644
> --- a/drivers/ata/libata-scsi.c
> +++ b/drivers/ata/libata-scsi.c
> @@ -3398,7 +3398,8 @@ int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
>  		 */
>  		shost->max_host_blocked = 1;
>  
> -		rc = scsi_add_host(ap->scsi_host, &ap->tdev);
> +		rc = scsi_add_host_with_dma(ap->scsi_host,
> +						&ap->tdev, ap->host->dev);
>  		if (rc)
>  			goto err_add;
>  	}
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index f85cfa6..486088b 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -1642,7 +1642,7 @@ struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost,
>  					 request_fn_proc *request_fn)
>  {
>  	struct request_queue *q;
> -	struct device *dev = shost->shost_gendev.parent;
> +	struct device *dev = shost->dma_dev;
>  
>  	q = blk_init_queue(request_fn, NULL);
>  	if (!q)
> -- 
> 1.7.2.5
> 
> 

Regards, Jörg.

Patch

diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 7ae1e77..e47f889 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -3398,7 +3398,8 @@  int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
 		 */
 		shost->max_host_blocked = 1;
 
-		rc = scsi_add_host(ap->scsi_host, &ap->tdev);
+		rc = scsi_add_host_with_dma(ap->scsi_host,
+						&ap->tdev, ap->host->dev);
 		if (rc)
 			goto err_add;
 	}
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index f85cfa6..486088b 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1642,7 +1642,7 @@  struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost,
 					 request_fn_proc *request_fn)
 {
 	struct request_queue *q;
-	struct device *dev = shost->shost_gendev.parent;
+	struct device *dev = shost->dma_dev;
 
 	q = blk_init_queue(request_fn, NULL);
 	if (!q)