From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: ttm dma allocator issue ? Date: Mon, 12 Dec 2011 12:37:43 -0500 Message-ID: <20111212173743.GA2431@phenom.dumpdata.com> References: <20111210022543.GA2363@homer.localdomain> <20111212162115.GA17658@phenom.dumpdata.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by gabe.freedesktop.org (Postfix) with ESMTP id 5E8279E7F4 for ; Mon, 12 Dec 2011 09:39:04 -0800 (PST) Content-Disposition: inline In-Reply-To: <20111212162115.GA17658@phenom.dumpdata.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: Jerome Glisse Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org > > Any ideas ? > > The only way to do that would be to modify the 'struct dma_page' vaddr and dma > variables from what they had in __ttm_dma_alloc_page. But I am not seeing any > willfull modifications. We do pass in to dma_free_coherent the _same_ values! > > > Hm, it might be worth adding in the 'struct dma_page' a 'virt_to_phys' value > (which is what the DMA debug API uses to check), and see we get inconsitent > values _before_ we call the DMA debug API. This is rather to double check > the DMA API debug API. I am going to try something like this (not compile tested at all): This one is compile tested :-) diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c index 6678abc..659b0ee 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c @@ -32,7 +32,7 @@ * - Tracks whether the page is UC, WB or cached (and reverts to WB * when freed). */ - +#define DEBUG 1 #include #include #include /* for seq_printf */ @@ -127,6 +127,7 @@ struct dma_page { void *vaddr; struct page *p; dma_addr_t dma; + void *phys; /* Based on virt_to_phys so not really bus addr */ }; /* @@ -330,6 +331,11 @@ static int ttm_set_pages_caching(struct dma_pool *pool, static void __ttm_dma_free_page(struct dma_pool *pool, struct dma_page *d_page) { dma_addr_t dma = d_page->dma; + + WARN(virt_to_phys(d_page->vaddr) != d_page->phys, + "We saved 0x%lx, but now we get 0x%lx!?\n", + (unsigned long)d_page->phys, (unsigned long)virt_to_phys(d_page->vaddr)); + dma_free_coherent(pool->dev, pool->size, d_page->vaddr, dma); kfree(d_page); @@ -346,8 +352,10 @@ static struct dma_page *__ttm_dma_alloc_page(struct dma_pool *pool) d_page->vaddr = dma_alloc_coherent(pool->dev, pool->size, &d_page->dma, pool->gfp_flags); - if (d_page->vaddr) + if (d_page->vaddr) { d_page->p = virt_to_page(d_page->vaddr); + d_page->phys = virt_to_phys(d_page->vaddr); + } else { kfree(d_page); d_page = NULL;