From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from server.prisktech.co.nz ([115.188.14.127]) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UksaD-0006Wh-Tj for linux-mtd@lists.infradead.org; Fri, 07 Jun 2013 09:03:42 +0000 Message-ID: <51B1A1DE.3020603@prisktech.co.nz> Date: Fri, 07 Jun 2013 21:03:26 +1200 From: Tony Prisk MIME-Version: 1.0 To: linux--arm-kernel@lists.infradead.org Subject: NAND buffer allocation fails Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: linux-mtd@lists.infradead.org, dwmw2@infradead.org List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Could someone explain why the following situation might occur: In drivers/mtd/nand/nand_base.c, we have: int nand_scan_tail(struct mtd_info *mtd) { int i; struct nand_chip *chip = mtd->priv; /* New bad blocks should be marked in OOB, flash-based BBT, or both */ BUG_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) && !(chip->bbt_options & NAND_BBT_USE_FLASH)); if (!(chip->options & NAND_OWN_BUFFERS)) chip->buffers = kmalloc(sizeof(*chip->buffers), GFP_KERNEL); if (!chip->buffers) return -ENOMEM; ... For some reason, the kmalloc always fails on my configuration/hardware (arch-vt8500: WonderMedia/VIA APC8750). The strange thing is that if I add the NAND_OWN_BUFFERS option, and allocate my own buffers in the driver probe everything is fine. Driver probe code below: priv->nand.buffers = devm_kzalloc(priv->dev, sizeof(*priv->nand.buffers), GFP_KERNEL); if (!priv->nand.buffers) { dev_err(priv->dev, "failed to allocate NAND buffers\n"); return -ENOMEM; } The devm_kzalloc does occur earlier than the nand_scan_tail alloc would have, but there doesn't appear to be a shortage of memory on the platform so I don't think it's failing for a memory shortage. Is there any real difference between using kmalloc and devm_kzalloc to allocate the buffer (other than the obvious 0'ing of the buffer)? Why would one call fail and the other succeed? Regards Tony Prisk