Received: by 10.192.165.156 with SMTP id m28csp351647imm; Tue, 10 Apr 2018 23:29:46 -0700 (PDT) X-Google-Smtp-Source: AIpwx48HNTZPRwtpJVBgzePKfqdL+ctUTLNAPjxoA6BJHQpdYt9sqkiXjKSLmD3zBllWzyHoj3iZ X-Received: by 2002:a17:902:8a82:: with SMTP id p2-v6mr3106591plo.91.1523428186929; Tue, 10 Apr 2018 23:29:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523428186; cv=none; d=google.com; s=arc-20160816; b=dnSVvurlo67S0Wrd2JhQugOBzrc51CZmQ+84jnoZ7/osBCy5+oMd+HZOoO6tMQWrKj FFPahIqBcXPSKmCRxVkqDS3wS8uFS4/2OSIbCweiu3FyCotXYytVtRONA7swIhm9s2q9 TGa9K+6Iujm5+qAZ9rlEa2OXXBj2AJdGEtlU1KqMTwX+pHJGVFvIllX8Z+Zjo16TrkSM kogMTsEXCZsLKgyFj9EoQL6RDoX64dW2R2M5TmDql+jY6jk69ury58xH7tHzHrGJhDLE G8BzstQ9t8aQ/DSdTGV9LN4d1bfi8xHPYvMKxsb92bXOxcY6LfXqC7kx9Rtn3mhg5wDs zvIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=efbaWWW8Cp+taLcF8n7okBbtAV+s3R0Erd094bpIf9I=; b=e5/cJzcgFOzur9jbu5ceWGoB6R+ah0JoCSn6HudrS9cXa9az9lx1D9h9CAvEZHIqQQ jAXSt4Nq9XYpMCON53ZXmswSgmSu3hwSoK9gnuCVZO5/80N3wDeYlDXCBZVVVcsv/Yff SGjW+RvP9OLQTR9l4JUrUQlSkbclu/35+Je66GB0NAS7oCF0lQi286/OFStZjddEDzZo 7z6JWxHUZkol+KtmE8mtjX/Z9sEus/Up4RiILDxg0MLroswNQKUeBlH65Yv2S2Qy9jbY GAi35iKuFSZRMsNkC0rknAj7ZeiSFgF72VI8mC087No1EON+UOmW07y8wa6xkfkzZTT7 R/aQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h1-v6si478494pln.138.2018.04.10.23.29.09; Tue, 10 Apr 2018 23:29:46 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752212AbeDKG0M (ORCPT + 99 others); Wed, 11 Apr 2018 02:26:12 -0400 Received: from eddie.linux-mips.org ([148.251.95.138]:38096 "EHLO cvs.linux-mips.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751841AbeDKG0K (ORCPT ); Wed, 11 Apr 2018 02:26:10 -0400 Received: (from localhost user: 'ladis' uid#1021 fake: STDIN (ladis@eddie.linux-mips.org)) by eddie.linux-mips.org id S23990427AbeDKG0Igs2QH (ORCPT + 1 other); Wed, 11 Apr 2018 08:26:08 +0200 Date: Wed, 11 Apr 2018 08:26:07 +0200 From: Ladislav Michl To: Andreas Kemnade Cc: Discussions about the Letux Kernel , Boris Brezillon , Aaro Koskinen , Tony Lindgren , Linux Kernel Mailing List , Peter Ujfalusi , linux-omap , Roger Quadros Subject: Re: [Letux-kernel] [Bug]: mtd: onenand: omap2plus: kernel panic with OneNAND on OMAP3 (DM3730) device GTA04A5 Message-ID: <20180411062607.GA9179@lenoch> References: <5D496D5C-4E3E-47B4-9981-E8F4C348DE00@goldelico.com> <20180410205643.GA2228@lenoch> <20180411065836.7e1bfc3f@aktux> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180411065836.7e1bfc3f@aktux> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Andreas, On Wed, Apr 11, 2018 at 06:59:03AM +0200, Andreas Kemnade wrote: > Hi Ladis, > > On Tue, 10 Apr 2018 22:56:43 +0200 > Ladislav Michl wrote: > > > Hi Nikolaus, > > > > On Tue, Apr 10, 2018 at 06:25:17PM +0200, H. Nikolaus Schaller wrote: > > > Hi, > > > we just started testing the v4.16 kernel and found the > > > device no longer bootable (works with v4.15). It turned > > > out that there was a harmful modification somewhere between > > > v4.15.0 and v4.16-rc1. > > > > > > A git bisect points to this patch: > > > > Well, that's a shame... However, this code is in production for several > > months now, so could you, please put 'goto out_copy' if 'buf >= high_memory' > > condition is met, ie: > > --- a/drivers/mtd/nand/onenand/omap2.c > > +++ b/drivers/mtd/nand/onenand/omap2.c > > @@ -392,6 +392,7 @@ static int omap2_onenand_read_bufferram(struct mtd_info *mtd, int area, > > if (buf >= high_memory) { > > struct page *p1; > > > > + goto out_copy; > > if (((size_t)buf & PAGE_MASK) != > > ((size_t)(buf + count - 1) & PAGE_MASK)) > > goto out_copy; > > I had the same problem here, and that snippet helps here. ubiattach > -p /dev/mtdX does not cause kernel oopses here anymore It seems reviving old code always comes at a price :-) Could you try following patch, so far compile tested only? (we'll need to do the same for omap2_onenand_write_bufferram, but it sould be enough for testing purposes now) diff --git a/drivers/mtd/nand/onenand/omap2.c b/drivers/mtd/nand/onenand/omap2.c index 9c159f0dd9a6..04cefd7a6487 100644 --- a/drivers/mtd/nand/onenand/omap2.c +++ b/drivers/mtd/nand/onenand/omap2.c @@ -375,11 +375,12 @@ static int omap2_onenand_read_bufferram(struct mtd_info *mtd, int area, { struct omap2_onenand *c = container_of(mtd, struct omap2_onenand, mtd); struct onenand_chip *this = mtd->priv; + struct device *dev = &c->pdev->dev; dma_addr_t dma_src, dma_dst; int bram_offset; void *buf = (void *)buffer; size_t xtra; - int ret; + int ret, page_dma = 0; bram_offset = omap2_onenand_bufferram_offset(mtd, area) + area + offset; if (bram_offset & 3 || (size_t)buf & 3 || count < 384) @@ -389,38 +390,43 @@ static int omap2_onenand_read_bufferram(struct mtd_info *mtd, int area, if (in_interrupt() || oops_in_progress) goto out_copy; + xtra = count & 3; + if (xtra) { + count -= xtra; + memcpy(buf + count, this->base + bram_offset + count, xtra); + } + + /* Handle vmalloc address */ if (buf >= high_memory) { - struct page *p1; + struct page *page; if (((size_t)buf & PAGE_MASK) != ((size_t)(buf + count - 1) & PAGE_MASK)) goto out_copy; - p1 = vmalloc_to_page(buf); - if (!p1) + page = vmalloc_to_page(buf); + if (!page) goto out_copy; - buf = page_address(p1) + ((size_t)buf & ~PAGE_MASK); - } - - xtra = count & 3; - if (xtra) { - count -= xtra; - memcpy(buf + count, this->base + bram_offset + count, xtra); + page_dma = 1; + dma_dst = dma_map_page(dev, page, (size_t) buf & ~PAGE_MASK, + count, DMA_FROM_DEVICE); + } else { + dma_dst = dma_map_single(dev, buf, count, DMA_FROM_DEVICE); } - dma_src = c->phys_base + bram_offset; - dma_dst = dma_map_single(&c->pdev->dev, buf, count, DMA_FROM_DEVICE); - if (dma_mapping_error(&c->pdev->dev, dma_dst)) { - dev_err(&c->pdev->dev, - "Couldn't DMA map a %d byte buffer\n", - count); + + if (dma_mapping_error(dev, dma_dst)) { + dev_err(dev, "Couldn't DMA map a %d byte buffer\n", count); goto out_copy; } ret = omap2_onenand_dma_transfer(c, dma_src, dma_dst, count); - dma_unmap_single(&c->pdev->dev, dma_dst, count, DMA_FROM_DEVICE); + if (page_dma) + dma_unmap_page(dev, dma_dst, count, DMA_FROM_DEVICE); + else + dma_unmap_single(dev, dma_dst, count, DMA_FROM_DEVICE); if (ret) { - dev_err(&c->pdev->dev, "timeout waiting for DMA\n"); + dev_err(dev, "timeout waiting for DMA\n"); goto out_copy; }