Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757069Ab3J1QUd (ORCPT ); Mon, 28 Oct 2013 12:20:33 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:38521 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757025Ab3J1QUc (ORCPT ); Mon, 28 Oct 2013 12:20:32 -0400 From: Ming Lei To: linux-kernel@vger.kernel.org, Andrew Morton Cc: Ming Lei , Russell King - ARM Linux , linux-arm-kernel@lists.infradead.org, Simon Baatz , Will Deacon , Aaro Koskinen , Catalin Marinas , FUJITA Tomonori , Tejun Heo , "James E.J. Bottomley" , Jens Axboe Subject: [PATCH] lib/scatterlist.c: don't flush_kernel_dcache_page on slab page Date: Tue, 29 Oct 2013 00:20:05 +0800 Message-Id: <1382977205-26268-1-git-send-email-ming.lei@canonical.com> X-Mailer: git-send-email 1.7.9.5 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2303 Lines: 60 Commit b1adaf65ba03([SCSI] block: add sg buffer copy helper functions) introduces two sg buffer copy helpers, and calls flush_kernel_dcache_page() on pages in SG list after these pages are written to. Unfortunately, the commit may introduce a potential bug: - Before sending some SCSI commands, kmalloc() buffer may be passed to block layper, so flush_kernel_dcache_page() can see a slab page finally - According to cachetlb.txt, flush_kernel_dcache_page() is only called on "a user page", which surely can't be a slab page. - ARCH's implementation of flush_kernel_dcache_page() may use page mapping information to do optimization so page_mapping() will see the slab page, then VM_BUG_ON() is triggered. Aaro Koskinen reported the bug on ARM/kirkwood when DEBUG_VM is enabled, and this patch fixes the bug by adding test of '!PageSlab(miter->page)' before calling flush_kernel_dcache_page(). Reported-by: Aaro Koskinen Cc: Russell King - ARM Linux Cc: linux-arm-kernel@lists.infradead.org Cc: Simon Baatz Cc: Will Deacon Cc: Aaro Koskinen Cc: Catalin Marinas Cc: Andrew Morton Cc: FUJITA Tomonori Cc: Tejun Heo Cc: "James E.J. Bottomley" Cc: Jens Axboe Signed-off-by: Ming Lei --- lib/scatterlist.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/scatterlist.c b/lib/scatterlist.c index a685c8a..d16fa29 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -577,7 +577,8 @@ void sg_miter_stop(struct sg_mapping_iter *miter) miter->__offset += miter->consumed; miter->__remaining -= miter->consumed; - if (miter->__flags & SG_MITER_TO_SG) + if ((miter->__flags & SG_MITER_TO_SG) && + !PageSlab(miter->page)) flush_kernel_dcache_page(miter->page); if (miter->__flags & SG_MITER_ATOMIC) { -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/