From patchwork Tue Oct 6 10:13:56 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joerg Roedel X-Patchwork-Id: 526682 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0F175140D71 for ; Tue, 6 Oct 2015 21:14:06 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=8bytes.org header.i=@8bytes.org header.b=n5Zo3vdu; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752290AbbJFKOB (ORCPT ); Tue, 6 Oct 2015 06:14:01 -0400 Received: from 8bytes.org ([81.169.241.247]:35175 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752278AbbJFKN6 (ORCPT ); Tue, 6 Oct 2015 06:13:58 -0400 Received: by theia.8bytes.org (Postfix, from userid 1000) id B40973C6; Tue, 6 Oct 2015 12:13:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=8bytes.org; s=mail-1; t=1444126436; bh=ISX/p0angoqmlJEQTif75xSzc4+QnHJ0unboqO/9z6g=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=n5Zo3vdukqRD9utP1I8pQBnrNgQ/f7Qa7cUDjFz3pSa6SYy09s7v/6siD9gIHNUfs 62PmuQx6gwMyr72mGmTWWgXT0VJR4/+wFrz+2bBMeDmtmnwM3auFuZAHeKEwYAtuGL A8CTH8BlMOSi23bkZfR2lMAxqx/j/GNAP+2abtlGKYJS3qXP1vwrpmWCO80RB6EKoa Ik1Dh0ApYBld4Q3IxuBUvwp/PUhxs3XjHnvIa3g177yIeVk9keeI/RyNMBXdC4FbIn B8enx8LJNg6hzpnh1y1d7fWBIYeqUHt/mbpbGqZUsVJVZ/paXazY1Fr5pJXDSyOEqP JhW1EJje4HwQA== Date: Tue, 6 Oct 2015 12:13:56 +0200 From: Joerg Roedel To: Andreas Hartmann Cc: Mikulas Patocka , iommu@lists.linux-foundation.org, Leo Duran , Christoph Hellwig , device-mapper development , Milan Broz , Jens Axboe , linux-pci , Linus Torvalds Subject: Re: [dm-devel] AMD-Vi IO_PAGE_FAULTs and ata3.00: failed command: READ FPDMA QUEUED errors since Linux 4.0 Message-ID: <20151006101356.GE12506@8bytes.org> References: <55B7D054.4070308@maya.org> <20150728192908.GA25264@redhat.com> <55BCD5A7.2080708@maya.org> <55BE1D5E.6020709@maya.org> <55FE5740.2060701@maya.org> <20150929152100.GL3036@8bytes.org> <20150929162042.GR3036@8bytes.org> <560BF73F.8000008@maya.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <560BF73F.8000008@maya.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Wed, Sep 30, 2015 at 04:52:47PM +0200, Andreas Hartmann wrote: > > Alternativly someone who can reproduce it should trace the calls to > > __map_single and __unmap_single in the AMD IOMMU driver to find out > > whether the addresses which the faults happen on are really mapped, or > > at least requested from the AMD IOMMU driver. > > How can I trace it? Please apply the attached debug patch on-top of Linux v4.3-rc3 and boot the machine. After boot you run (as root): # cat /sys/kernel/debug/tracing/trace_pipe > trace-data Please run this in a seperate shell an keep it running. Then trigger the problem while the above command is running. When you triggered it, please send me the (compressed) trace-data file, full dmesg and output of lspci on the box. Please let me know if you have further questions. Thanks, Joerg diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index f82060e7..0002e79 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2465,6 +2465,7 @@ static dma_addr_t __map_single(struct device *dev, { dma_addr_t offset = paddr & ~PAGE_MASK; dma_addr_t address, start, ret; + phys_addr_t old_paddr = paddr; unsigned int pages; unsigned long align_mask = 0; int i; @@ -2521,6 +2522,8 @@ retry: domain_flush_pages(&dma_dom->domain, address, size); out: + trace_printk("%s: mapped %llx paddr %llx size %zu\n", + dev_name(dev), address, old_paddr, size); return address; out_unmap: @@ -2532,6 +2535,9 @@ out_unmap: dma_ops_free_addresses(dma_dom, address, pages); + trace_printk("%s: return DMA_ERROR_CODE paddr %llx size %zu\n", + dev_name(dev), old_paddr, size); + return DMA_ERROR_CODE; } @@ -2628,6 +2634,8 @@ static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, spin_lock_irqsave(&domain->lock, flags); + trace_printk("%s: unmap dma_addr %llx size %zu\n", + dev_name(dev), dma_addr, size); __unmap_single(domain->priv, dma_addr, size, dir); domain_flush_complete(domain); @@ -2683,9 +2691,13 @@ out: return mapped_elems; unmap: for_each_sg(sglist, s, mapped_elems, i) { - if (s->dma_address) + if (s->dma_address) { + trace_printk("%s: unmap dma_addr %llx size %u\n", + dev_name(dev), s->dma_address, + s->dma_length); __unmap_single(domain->priv, s->dma_address, s->dma_length, dir); + } s->dma_address = s->dma_length = 0; } @@ -2716,6 +2728,9 @@ static void unmap_sg(struct device *dev, struct scatterlist *sglist, spin_lock_irqsave(&domain->lock, flags); for_each_sg(sglist, s, nelems, i) { + trace_printk("%s: unmap dma_addr %llx size %u\n", + dev_name(dev), s->dma_address, s->dma_length); + __unmap_single(domain->priv, s->dma_address, s->dma_length, dir); s->dma_address = s->dma_length = 0; @@ -2813,6 +2828,9 @@ static void free_coherent(struct device *dev, size_t size, spin_lock_irqsave(&domain->lock, flags); + trace_printk("%s: unmap dma_addr %llx size %zu\n", + dev_name(dev), dma_addr, size); + __unmap_single(domain->priv, dma_addr, size, DMA_BIDIRECTIONAL); domain_flush_complete(domain);