From patchwork Thu Aug 31 03:09:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Pitre X-Patchwork-Id: 111350 Delivered-To: patch@linaro.org Received: by 10.140.95.112 with SMTP id h103csp1907999qge; Wed, 30 Aug 2017 20:10:16 -0700 (PDT) X-Received: by 10.99.119.73 with SMTP id s70mr808707pgc.186.1504149015952; Wed, 30 Aug 2017 20:10:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504149015; cv=none; d=google.com; s=arc-20160816; b=K+qdeXE6/w1AqGdGfjQEbKZdZpcmMxe3/auGdwI/iRWrmjPcEOF8c6GffPNV0/oxW7 lXunebdogWloRwalGcXmuOAYkdVYoesdGi70Gzq8qJADlZ5HffbU6wARlHYquBVqGWGn HcbcO6UpUniRQNmhv+3AC1Vx4aiDaMqTswnpaF8q233NFoCxS5tDn7o9KwoUgdy46j6W aXxrDDLr/a6j/SzLGzrh0m4sQ/2/LGyzDVIk5zCU1qZpJgRxMWhYRjxmN7H+CFR8PsoO aDoK34wW7w0KsPH1vnI/4Bgz92scE9eNy3NQ59IONt7q7sga080mwvan3aXlpdRfQMF7 7DUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=vEV6Pz4iM6YTChxDvKN015fgS48SOkC6YV+Ibjkdu0M=; b=bTBlkK70Z87Uo8PxD1tcoF/0cjMWK4ffAwPmVnNrLCbZci+QnY8H/z1hrzefOWTom+ Sp6vJvx76lRDanVZjFG0mrhhb/Ql5+bO+943iK8obuHydKD24pM7IsMajNHds+JA57hm ojO98Cb2IhddvJieeVUdi44dY7pDmLMFn9ju3UYQDmKNLWHqebIlcnkE+nWW0Cxsx1HC tBYBk7yU+/4k5bl3cv4Gc5bx/RldhEmhF5tK4NmdPrY8Soc+eSNf/Xo+LPWY296hL/jm JyVkL2rkvvjAivj17HU7W4oo3Vk7Z8xQ+oSBqmkWp3Nb1QWPUrF44KMjqEDhCCml+1jI ZNFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@pobox.com header.s=sasl header.b=xBwI5lTX; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a124si5463086pgc.803.2017.08.30.20.10.15; Wed, 30 Aug 2017 20:10:15 -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; dkim=pass header.i=@pobox.com header.s=sasl header.b=xBwI5lTX; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751416AbdHaDJk (ORCPT + 26 others); Wed, 30 Aug 2017 23:09:40 -0400 Received: from pb-smtp1.pobox.com ([64.147.108.70]:54340 "EHLO sasl.smtp.pobox.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750948AbdHaDJi (ORCPT ); Wed, 30 Aug 2017 23:09:38 -0400 Received: from sasl.smtp.pobox.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id 5E0CB9C7F7; Wed, 30 Aug 2017 23:09:37 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pobox.com; h=from:to:cc :subject:date:message-id; s=sasl; bh=L6tddScXFU/KIVP8x/6x0hjC4IE =; b=xBwI5lTXuVbpp+sXxoF90r62t4fZsFUA3ZJ9bXGVRgzVmLR2cI7spb+6Wuy ygF1ZwtTO53nZ/rh8tYJ2/9s71Fev9ZHzPAlJhIFpaxvT6CArrTh5K++YbzUgQ2h usQJeAjwMh5XDaH7bbqfJZ5ejRdizdWWpqqaL061VeQNf7Os= Received: from pb-smtp1.nyi.icgroup.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id 546369C7F6; Wed, 30 Aug 2017 23:09:37 -0400 (EDT) Received: from yoda.home (unknown [70.80.200.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pb-smtp1.pobox.com (Postfix) with ESMTPSA id AC9889C7F4; Wed, 30 Aug 2017 23:09:36 -0400 (EDT) Received: from xanadu.home (xanadu.home [192.168.2.2]) by yoda.home (Postfix) with ESMTP id D645B2DA0194; Wed, 30 Aug 2017 23:09:35 -0400 (EDT) From: Nicolas Pitre To: Alexander Viro Cc: linux-fsdevel@vger.kernel.org, linux-embedded@vger.kernel.org, linux-kernel@vger.kernel.org, Chris Brandt Subject: [GIT PULL / PATCH v3 0/5] cramfs refresh for embedded usage Date: Wed, 30 Aug 2017 23:09:27 -0400 Message-Id: <20170831030932.26979-1-nicolas.pitre@linaro.org> X-Mailer: git-send-email 2.9.5 X-Pobox-Relay-ID: D1F92A8A-8DF9-11E7-8772-FE4B1A68708C-78420484!pb-smtp1.pobox.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This series is also available based on v4.13-rc4 via git here: http://git.linaro.org/people/nicolas.pitre/linux xipcramfs Please consider this an official merge request. This series brings a nice refresh to the cramfs filesystem, adding the following capabilities: - Direct memory access, bypassing the block and/or MTD layers entirely. - Ability to store individual data blocks uncompressed. - Ability to locate individual data blocks anywhere in the filesystem. The end result is a very tight filesystem that can be accessed directly from ROM without any other subsystem underneath. Also this allows for user space XIP which is a very important feature for tiny embedded systems. Why cramfs? Because cramfs is very simple and small. With CONFIG_CRAMFS_BLOCK=n and CONFIG_CRAMFS_PHYSMEM=y the cramfs driver may use as little as 3704 bytes of code. That's many times smaller than squashfs. And the runtime memory usage is also much less with cramfs than squashfs. It packs very tightly already compared to romfs which has no compression support. And the cramfs format was simple to extend, allowing for both compressed and uncompressed blocks within the same file. Why not accessing ROM via MTD? The MTD layer is nice and flexible. It also represents a huge overhead considering its core with no other enabled options weights 19KB. That's many times the size of the cramfs code for something that essentially boils down to a glorified argument parser and a call to memremap() in this case. And if someone still wants to use cramfs via MTD then it is already possible with mtdblock. Why not using DAX? DAX stands for "Direct Access" and is a generic kernel layer helping with the necessary tasks involved with XIP. It is tailored for large writable filesystems and relies on the presence of an MMU. It also has the following shortcoming: "The DAX code does not work correctly on architectures which have virtually mapped caches such as ARM, MIPS and SPARC." That makes it unsuitable for a large portion of the intended targets for this series. And due to the read-only nature of cramfs, it is possible to achieve the intended result with a much simpler approach making DAX somewhat overkill in this context. The maximum size of a cramfs image can't exceed 272MB. In practice it is likely to be much much less. Given this series is concerned with small memory systems, even in the MMU case there is always plenty of vmalloc space left to map it all and even a 272MB memremap() wouldn't be a problem. If it is then maybe your system is big enough with large resources to manage already and you're pretty unlikely to be using cramfs in the first place. Of course, while this cramfs remains backward compatible with existing filesystem images, a newer mkcramfs version is necessary to take advantage of the extended data layout. I created a version of mkcramfs that detects ELF files and marks text+rodata segments for XIP and compresses the rest of those ELF files automatically. So here it is. I'm also willing to step up as cramfs maintainer given that no sign of any maintenance activities appeared for years. Changes from v2: - Plugged a few races in cramfs_vmasplit_fault(). Thanks to Al Viro for highlighting them. - Fixed some checkpatch warnings Changes from v1: - Improved mmap() support by adding the ability to partially populate a mapping and lazily split the non directly mapable pages to a separate vma at fault time (thanks to Chris Brandt for testing). - Clarified the documentation some more. diffstat: Documentation/filesystems/cramfs.txt | 42 ++ MAINTAINERS | 4 +- fs/cramfs/Kconfig | 38 +- fs/cramfs/README | 31 +- fs/cramfs/inode.c | 646 ++++++++++++++++++++++++++--- include/uapi/linux/cramfs_fs.h | 20 +- init/do_mounts.c | 8 + 7 files changed, 712 insertions(+), 77 deletions(-)