From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762801AbbA3VDf (ORCPT ); Fri, 30 Jan 2015 16:03:35 -0500 Received: from mail-la0-f54.google.com ([209.85.215.54]:64295 "EHLO mail-la0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752775AbbA3VDd (ORCPT ); Fri, 30 Jan 2015 16:03:33 -0500 Message-ID: <54CBF1A0.9080005@cogentembedded.com> Date: Sat, 31 Jan 2015 00:03:28 +0300 From: Sergei Shtylyov Organization: Cogent Embedded User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: Tim Chen , "H. Peter Anvin" , Akinobu Mita , Mathias Nyman CC: Andi Kleen , Ingo Molnar , Andrew Morton , Marek Szyprowski , Thomas Gleixner , linux-kernel@vger.kernel.org, x86@kernel.org, linux-usb@vger.kernel.org Subject: Re: [PATCH] pci-dma: Fix x86 dma_alloc_coherent to fully clear all pages returned References: <1422647641.9530.2.camel@schen9-desk2.jf.intel.com> In-Reply-To: <1422647641.9530.2.camel@schen9-desk2.jf.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/30/2015 10:54 PM, Tim Chen wrote: > Commit d92ef66c4f8f ("x86: make dma_alloc_coherent() return zeroed memory > if CMA is enabled") changed the dma_alloc_coherent page clearance from > using an __GFP_ZERO in page allocation to not setting the flag but doing > an explicit memory clear at the end. > However the memory clear only covered the memory size that > was requested, but may not be up to the full extent of the > last page, if the total pages returned exceed the > memory size requested. This behavior has caused problem with XHCI > and caused it to hang and froze usb: > kernel: xhci_hcd 0000:00:14.0: Stopped the command ring failed, maybe the host is dead > kernel: xhci_hcd 0000:00:14.0: Abort command ring failed > kernel: xhci_hcd 0000:00:14.0: HC died; cleaning up > kernel: xhci_hcd 0000:00:14.0: Error while assigning device slot ID > kernel: xhci_hcd 0000:00:14.0: Max number of devices this xHCI host supports is 64. > Other drivers may have similar issue if it assumes that the pages > allocated are completely zeroed. > This patch ensures that the pages returned are fully cleared. > Signed-off-by: Tim Chen > --- > arch/x86/kernel/pci-dma.c | 2 ++ > 1 file changed, 2 insertions(+) > diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c > index a25e202..534470f 100644 > --- a/arch/x86/kernel/pci-dma.c > +++ b/arch/x86/kernel/pci-dma.c > @@ -125,6 +125,8 @@ again: > > return NULL; > } > + /* round up to full page size */ > + size = (((size-1) >> PAGE_SHIFT) + 1) * PAGE_SIZE; This is quite suboptimal formula, we can do without shifts and multiplications (hopefully, still converted to shifts by gcc): size = (size + ~PAGE_MASK) & PAGE_MASK; WBR, Sergei