Skip to content
  1. Dec 29, 2018
    • Kuninori Morimoto's avatar
      sh: drivers: convert to SPDX identifiers · ff4a7481
      Kuninori Morimoto authored
      
      
      Update license to use SPDX-License-Identifier instead of verbose license
      text.
      
      As original license mentioned, it is GPL-2.0 in SPDX.
      Then, MODULE_LICENSE() should be "GPL v2" instead of "GPL".
      See ${LINUX}/include/linux/module.h
      
      	"GPL"		[GNU Public License v2 or later]
      	"GPL v2"	[GNU Public License v2]
      
      Link: http://lkml.kernel.org/r/87h8fsct0a.wl-kuninori.morimoto.gx@renesas.com
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Reviewed-by: default avatarSimon Horman <horms+renesas@verge.net.au>
      Cc: Rich Felker <dalias@libc.org>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      ff4a7481
    • Kuninori Morimoto's avatar
      sh: boards: convert to SPDX identifiers · aaf9128a
      Kuninori Morimoto authored
      
      
      Update license to use SPDX-License-Identifier instead of verbose license
      text.
      
      Link: http://lkml.kernel.org/r/87in08ct0n.wl-kuninori.morimoto.gx@renesas.com
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Reviewed-by: default avatarSimon Horman <horms+renesas@verge.net.au>
      Cc: Rich Felker <dalias@libc.org>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      aaf9128a
    • YueHaibing's avatar
      arch/sh/boards/mach-kfr2r09/setup.c: drop pointless static qualifier in kfr2r09_usb0_gadget_setup() · ffa6daa9
      YueHaibing authored
      
      
      There is no need to have the 'struct clk *camera_clk' variable static
      since a new value is always assigned before use.
      
      Link: http://lkml.kernel.org/r/1543628631-99957-1-git-send-email-yuehaibing@huawei.com
      Signed-off-by: default avatarYueHaibing <yuehaibing@huawei.com>
      Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Cc: Rich Felker <dalias@libc.org>
      Cc: Jacopo Mondi <jacopo+renesas@jmondi.org>
      Cc: "Miquel Raynal" <miquel.raynal@bootlin.com>
      Cc: Randy Dunlap <rdunlap@infradead.org>
      Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      ffa6daa9
    • Randy Dunlap's avatar
      arch/sh/boards/mach-kfr2r09/setup.c: fix struct mtd_oob_ops build warning · 440e7b37
      Randy Dunlap authored
      arch/sh/boards/mach-kfr2r09/setup.c does not need to #include
      <mtd/onenand.h>, and doing so causes a build warning, so drop that header
      file.
      
      In file included from ../arch/sh/boards/mach-kfr2r09/setup.c:28:
      ../include/linux/mtd/onenand.h:225:12: warning: 'struct mtd_oob_ops' declared inside parameter list will not be visible outside of this definition or declaration
           struct mtd_oob_ops *ops);
      
      Link: http://lkml.kernel.org/r/702f0a25-c63e-6912-4640-6ab0f00afbc7@infradead.org
      Fixes: f3590dc3
      
       ("media: arch: sh: kfr2r09: Use new renesas-ceu camera driver")
      
      Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Reported-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Suggested-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
      Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Cc: Rich Felker <dalias@libc.org>
      Cc: Jacopo Mondi <jacopo+renesas@jmondi.org>
      Cc: Magnus Damm <magnus.damm@gmail.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      440e7b37
    • Kirill Tkhai's avatar
      scripts/tags.sh: add more declarations · cd68a525
      Kirill Tkhai authored
      
      
      New declarations and identifier (__always_inline).
      
      Link: http://lkml.kernel.org/r/154505048571.504.18330420599768007443.stgit@localhost.localdomain
      Signed-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
      Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
      Cc: Constantine Shulyupin <const@MakeLinux.com>
      Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
      Cc: Joey Pabalinas <joeypabalinas@gmail.com>
      Cc: Matthew Wilcox <willy@infradead.org>
      Cc: Arend van Spriel <arend.vanspriel@broadcom.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      cd68a525
    • Thierry Reding's avatar
      scripts: add spdxcheck.py self test · b72231eb
      Thierry Reding authored
      
      
      Add a script that will run spdxcheck.py through a couple of self tests to
      simplify validation in the future.  The tests are run for both Python 2
      and Python 3 to make sure all changes to the script remain compatible
      across both versions.
      
      The script tests a regular text file (Makefile) for basic sanity checks
      and then runs it on a binary file (Documentation/logo.gif) to make sure it
      works in both cases.  It also tests opening files passed on the command
      line as well as piped files read from standard input.  Finally a run on
      the complete tree will be performed to catch any other potential issues.
      
      Link: http://lkml.kernel.org/r/20181212131210.28024-2-thierry.reding@gmail.com
      Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
      Thomas Gleixner <tglx@linutronix.de>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Joe Perches <joe@perches.com>
      Cc: Jeremy Cline <jcline@redhat.com>
      Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundatio...>
      b72231eb
    • Qian Cai's avatar
      scripts/checkstack.pl: dynamic stack growth for aarch64 · 919e9d39
      Qian Cai authored
      
      
      This is to track dynamic amount of stack growth for aarch64, so it is
      possible to print out offensive functions that may consume too much stack.
      For example,
      
      0xffff2000084d1270 try_to_unmap_one [vmlinux]:		Dynamic (0xcf0)
      0xffff200008538358 migrate_page_move_mapping [vmlinux]:	Dynamic (0xc60)
      0xffff2000081276c8 copy_process.isra.2 [vmlinux]:	Dynamic (0xb20)
      0xffff200008424958 show_free_areas [vmlinux]:		Dynamic (0xb40)
      0xffff200008545178 __split_huge_pmd_locked [vmlinux]:	Dynamic (0xb30)
      0xffff200008555120 collapse_shmem [vmlinux]:		Dynamic (0xbc0)
      0xffff20000862e0d0 do_direct_IO [vmlinux]:		Dynamic (0xb70)
      0xffff200008cc0aa0 md_do_sync [vmlinux]:		Dynamic (0xb90)
      
      Link: http://lkml.kernel.org/r/20181208025143.39363-1-cai@lca.pw
      Signed-off-by: default avatarQian Cai <cai@lca.pw>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      919e9d39
    • Marc Zyngier's avatar
      scripts/decode_stacktrace: only strip base path when a prefix of the path · 67a28de4
      Marc Zyngier authored
      
      
      Running something like:
      
      	decodecode vmlinux .
      
      leads to interested results where not only the leading "." gets stripped
      from the displayed paths, but also anywhere in the string, displaying
      something like:
      
      	kvm_vcpu_check_block (arch/arm64/kvm/virt/kvm/kvm_mainc:2141)
      
      which doesn't help further processing.
      
      Fix it by only stripping the base path if it is a prefix of the path.
      
      Link: http://lkml.kernel.org/r/20181210174659.31054-3-marc.zyngier@arm.com
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      67a28de4
    • Marc Zyngier's avatar
      scripts/decodecode: set ARCH when running natively on arm/arm64 · c5cfb62f
      Marc Zyngier authored
      
      
      When running decodecode natively on arm64, ARCH is likely not to be set,
      and we end-up with .4byte instead of .inst when generating the
      disassembly.
      
      Similar effects would occur if running natively on a 32bit ARM platform,
      although that's even less popular.
      
      A simple workaround is to populate ARCH when it is not set and that we're
      running on an arm/arm64 system.
      
      Link: http://lkml.kernel.org/r/20181210174659.31054-2-marc.zyngier@arm.com
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      c5cfb62f
    • Rasmus Villemoes's avatar
      bloat-o-meter: ignore __addressable_ symbols · e0b2475a
      Rasmus Villemoes authored
      Since __LINE__ is part of the symbol created by __ADDRESSABLE, almost
      any change causes those symbols to disappear and get reincarnated, e.g.
      
      add/remove: 4/4 grow/shrink: 0/3 up/down: 32/-171 (-139)
      Function                                     old     new   delta
      __addressable_tracing_set_default_clock8649       -       8      +8
      __addressable_tracer_init_tracefs8631          -       8      +8
      __addressable_ftrace_dump8383                  -       8      +8
      __addressable_clear_boot_tracer8632            -       8      +8
      __addressable_tracing_set_default_clock8650       8       -      -8
      __addressable_tracer_init_tracefs8632          8       -      -8
      __addressable_ftrace_dump8384                  8       -      -8
      __addressable_clear_boot_tracer8633            8       -      -8
      trace_default_header                         663     642     -21
      tracing_mark_raw_write                       406     355     -51
      tracing_mark_write                           624     5...
      e0b2475a
    • Andrey Konovalov's avatar
      kasan: add SPDX-License-Identifier mark to source files · e886bf9d
      Andrey Konovalov authored
      
      
      This patch adds a "SPDX-License-Identifier: GPL-2.0" mark to all source
      files under mm/kasan.
      
      Link: http://lkml.kernel.org/r/bce2d1e618afa5142e81961ab8fa4b4165337380.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      e886bf9d
    • Andrey Konovalov's avatar
      kasan: update documentation · b3b0e6ac
      Andrey Konovalov authored
      
      
      This patch updates KASAN documentation to reflect the addition of the new
      tag-based mode.
      
      Link: http://lkml.kernel.org/r/aabef9de317c54b8a3919a4946ce534c6576726a.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      b3b0e6ac
    • Andrey Konovalov's avatar
      kasan, arm64: select HAVE_ARCH_KASAN_SW_TAGS · 2d4acb90
      Andrey Konovalov authored
      
      
      Now, that all the necessary infrastructure code has been introduced,
      select HAVE_ARCH_KASAN_SW_TAGS for arm64 to enable software tag-based
      KASAN mode.
      
      Link: http://lkml.kernel.org/r/25abce9a21d0c1df2d9d72488aced418c3465d7b.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      2d4acb90
    • Andrey Konovalov's avatar
      kasan: add __must_check annotations to kasan hooks · 66afc7f1
      Andrey Konovalov authored
      
      
      This patch adds __must_check annotations to kasan hooks that return a
      pointer to make sure that a tagged pointer always gets propagated.
      
      Link: http://lkml.kernel.org/r/03b269c5e453945f724bfca3159d4e1333a8fb1c.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Suggested-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      66afc7f1
    • Andrey Konovalov's avatar
      kasan, mm, arm64: tag non slab memory allocated via pagealloc · 2813b9c0
      Andrey Konovalov authored
      
      
      Tag-based KASAN doesn't check memory accesses through pointers tagged with
      0xff.  When page_address is used to get pointer to memory that corresponds
      to some page, the tag of the resulting pointer gets set to 0xff, even
      though the allocated memory might have been tagged differently.
      
      For slab pages it's impossible to recover the correct tag to return from
      page_address, since the page might contain multiple slab objects tagged
      with different values, and we can't know in advance which one of them is
      going to get accessed.  For non slab pages however, we can recover the tag
      in page_address, since the whole page was marked with the same tag.
      
      This patch adds tagging to non slab memory allocated with pagealloc.  To
      set the tag of the pointer returned from page_address, the tag gets stored
      to page->flags when the memory gets allocated.
      
      Link: http://lkml.kernel.org/r/d758ddcef46a5abc9970182b9137e2fbee202a2c.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      2813b9c0
    • Andrey Konovalov's avatar
      kasan, arm64: add brk handler for inline instrumentation · 41eea9cd
      Andrey Konovalov authored
      
      
      Tag-based KASAN inline instrumentation mode (which embeds checks of shadow
      memory into the generated code, instead of inserting a callback) generates
      a brk instruction when a tag mismatch is detected.
      
      This commit adds a tag-based KASAN specific brk handler, that decodes the
      immediate value passed to the brk instructions (to extract information
      about the memory access that triggered the mismatch), reads the register
      values (x0 contains the guilty address) and reports the bug.
      
      Link: http://lkml.kernel.org/r/c91fe7684070e34dc34b419e6b69498f4dcacc2d.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      41eea9cd
    • Andrey Konovalov's avatar
      kasan: add hooks implementation for tag-based mode · 7f94ffbc
      Andrey Konovalov authored
      
      
      This commit adds tag-based KASAN specific hooks implementation and
      adjusts common generic and tag-based KASAN ones.
      
      1. When a new slab cache is created, tag-based KASAN rounds up the size of
         the objects in this cache to KASAN_SHADOW_SCALE_SIZE (== 16).
      
      2. On each kmalloc tag-based KASAN generates a random tag, sets the shadow
         memory, that corresponds to this object to this tag, and embeds this
         tag value into the top byte of the returned pointer.
      
      3. On each kfree tag-based KASAN poisons the shadow memory with a random
         tag to allow detection of use-after-free bugs.
      
      The rest of the logic of the hook implementation is very much similar to
      the one provided by generic KASAN. Tag-based KASAN saves allocation and
      free stack metadata to the slab object the same way generic KASAN does.
      
      Link: http://lkml.kernel.org/r/bda78069e3b8422039794050ddcb2d53d053ed41.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      7f94ffbc
    • Andrey Konovalov's avatar
      mm: move obj_to_index to include/linux/slab_def.h · 5b7c4148
      Andrey Konovalov authored
      
      
      While with SLUB we can actually preassign tags for caches with contructors
      and store them in pointers in the freelist, SLAB doesn't allow that since
      the freelist is stored as an array of indexes, so there are no pointers to
      store the tags.
      
      Instead we compute the tag twice, once when a slab is created before
      calling the constructor and then again each time when an object is
      allocated with kmalloc.  Tag is computed simply by taking the lowest byte
      of the index that corresponds to the object.  However in kasan_kmalloc we
      only have access to the objects pointer, so we need a way to find out
      which index this object corresponds to.
      
      This patch moves obj_to_index from slab.c to include/linux/slab_def.h to
      be reused by KASAN.
      
      Link: http://lkml.kernel.org/r/c02cd9e574cfd93858e43ac94b05e38f891fef64.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Acked-by: default avatarChristoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      5b7c4148
    • Andrey Konovalov's avatar
      kasan: add bug reporting routines for tag-based mode · 121e8f81
      Andrey Konovalov authored
      
      
      This commit adds rountines, that print tag-based KASAN error reports.
      Those are quite similar to generic KASAN, the difference is:
      
      1. The way tag-based KASAN finds the first bad shadow cell (with a
         mismatching tag). Tag-based KASAN compares memory tags from the shadow
         memory to the pointer tag.
      
      2. Tag-based KASAN reports all bugs with the "KASAN: invalid-access"
         header.
      
      Also simplify generic KASAN find_first_bad_addr.
      
      Link: http://lkml.kernel.org/r/aee6897b1bd077732a315fd84c6b4f234dbfdfcb.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      121e8f81
    • Andrey Konovalov's avatar
      kasan: split out generic_report.c from report.c · 11cd3cd6
      Andrey Konovalov authored
      
      
      Move generic KASAN specific error reporting routines to generic_report.c
      without any functional changes, leaving common error reporting code in
      report.c to be later reused by tag-based KASAN.
      
      Link: http://lkml.kernel.org/r/ba48c32f8e5aefedee78998ccff0413bee9e0f5b.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      11cd3cd6
    • Andrey Konovalov's avatar
      kasan, mm: perform untagged pointers comparison in krealloc · 772a2fa5
      Andrey Konovalov authored
      
      
      The krealloc function checks where the same buffer was reused or a new one
      allocated by comparing kernel pointers.  Tag-based KASAN changes memory
      tag on the krealloc'ed chunk of memory and therefore also changes the
      pointer tag of the returned pointer.  Therefore we need to perform
      comparison on untagged (with tags reset) pointers to check whether it's
      the same memory region or not.
      
      Link: http://lkml.kernel.org/r/14f6190d7846186a3506cd66d82446646fe65090.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      772a2fa5
    • Andrey Konovalov's avatar
      kasan, arm64: enable top byte ignore for the kernel · 21696c16
      Andrey Konovalov authored
      
      
      Tag-based KASAN uses the Top Byte Ignore feature of arm64 CPUs to store a
      pointer tag in the top byte of each pointer.  This commit enables the
      TCR_TBI1 bit, which enables Top Byte Ignore for the kernel, when tag-based
      KASAN is used.
      
      Link: http://lkml.kernel.org/r/f51eca084c8cdb2f3a55195fe342dc8953b7aead.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      21696c16
    • Andrey Konovalov's avatar
      kasan, arm64: fix up fault handling logic · 356607f2
      Andrey Konovalov authored
      
      
      Right now arm64 fault handling code removes pointer tags from addresses
      covered by TTBR0 in faults taken from both EL0 and EL1, but doesn't do
      that for pointers covered by TTBR1.
      
      This patch adds two helper functions is_ttbr0_addr() and is_ttbr1_addr(),
      where the latter one accounts for the fact that TTBR1 pointers might be
      tagged when tag-based KASAN is in use, and uses these helper functions to
      perform pointer checks in arch/arm64/mm/fault.c.
      
      Link: http://lkml.kernel.org/r/3f349b0e9e48b5df3298a6b4ae0634332274494a.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Suggested-by: default avatarMark Rutland <mark.rutland@arm.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      356607f2
    • Andrey Konovalov's avatar
      kasan: preassign tags to objects with ctors or SLAB_TYPESAFE_BY_RCU · 4d176711
      Andrey Konovalov authored
      
      
      An object constructor can initialize pointers within this objects based on
      the address of the object.  Since the object address might be tagged, we
      need to assign a tag before calling constructor.
      
      The implemented approach is to assign tags to objects with constructors
      when a slab is allocated and call constructors once as usual.  The
      downside is that such object would always have the same tag when it is
      reallocated, so we won't catch use-after-frees on it.
      
      Also pressign tags for objects from SLAB_TYPESAFE_BY_RCU caches, since
      they can be validy accessed after having been freed.
      
      Link: http://lkml.kernel.org/r/f158a8a74a031d66f0a9398a5b0ed453c37ba09a.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      4d176711
    • Andrey Konovalov's avatar
      kasan, arm64: untag address in _virt_addr_is_linear · e71fe3f9
      Andrey Konovalov authored
      
      
      virt_addr_is_linear (which is used by virt_addr_valid) assumes that the
      top byte of the address is 0xff, which isn't always the case with
      tag-based KASAN.
      
      This patch resets the tag in this macro.
      
      Link: http://lkml.kernel.org/r/df73a37dd5ed37f4deaf77bc718e9f2e590e69b1.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      e71fe3f9
    • Andrey Konovalov's avatar
      kasan: add tag related helper functions · 3c9e3aa1
      Andrey Konovalov authored
      
      
      This commit adds a few helper functions, that are meant to be used to work
      with tags embedded in the top byte of kernel pointers: to set, to get or
      to reset the top byte.
      
      Link: http://lkml.kernel.org/r/f6c6437bb8e143bc44f42c3c259c62e734be7935.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      3c9e3aa1
    • Andrey Konovalov's avatar
      arm64: move untagged_addr macro from uaccess.h to memory.h · 9c23f847
      Andrey Konovalov authored
      
      
      Move the untagged_addr() macro from arch/arm64/include/asm/uaccess.h
      to arch/arm64/include/asm/memory.h to be later reused by KASAN.
      
      Also make the untagged_addr() macro accept all kinds of address types
      (void *, unsigned long, etc.). This allows not to specify type casts in
      each place where the macro is used. This is done by using __typeof__.
      
      Link: http://lkml.kernel.org/r/2e9ef8d2ed594106eca514b268365b5419113f6a.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      9c23f847
    • Andrey Konovalov's avatar
      kasan: initialize shadow to 0xff for tag-based mode · 080eb83f
      Andrey Konovalov authored
      
      
      A tag-based KASAN shadow memory cell contains a memory tag, that
      corresponds to the tag in the top byte of the pointer, that points to that
      memory.  The native top byte value of kernel pointers is 0xff, so with
      tag-based KASAN we need to initialize shadow memory to 0xff.
      
      [cai@lca.pw: arm64: skip kmemleak for KASAN again\
        Link: http://lkml.kernel.org/r/20181226020550.63712-1-cai@lca.pw
      Link: http://lkml.kernel.org/r/5cc1b789aad7c99cf4f3ec5b328b147ad53edb40.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      080eb83f
    • Andrey Konovalov's avatar
      kasan: rename kasan_zero_page to kasan_early_shadow_page · 9577dd74
      Andrey Konovalov authored
      
      
      With tag based KASAN mode the early shadow value is 0xff and not 0x00, so
      this patch renames kasan_zero_(page|pte|pmd|pud|p4d) to
      kasan_early_shadow_(page|pte|pmd|pud|p4d) to avoid confusion.
      
      Link: http://lkml.kernel.org/r/3fed313280ebf4f88645f5b89ccbc066d320e177.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Suggested-by: default avatarMark Rutland <mark.rutland@arm.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      9577dd74
    • Andrey Konovalov's avatar
      kasan, arm64: adjust shadow size for tag-based mode · b2f557ea
      Andrey Konovalov authored
      
      
      Tag-based KASAN uses 1 shadow byte for 16 bytes of kernel memory, so it
      requires 1/16th of the kernel virtual address space for the shadow memory.
      
      This commit sets KASAN_SHADOW_SCALE_SHIFT to 4 when the tag-based KASAN
      mode is enabled.
      
      Link: http://lkml.kernel.org/r/308b6bd49f756bb5e533be93c6f085ba99b30339.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      b2f557ea
    • Andrey Konovalov's avatar
      kasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS · 2bd926b4
      Andrey Konovalov authored
      
      
      This commit splits the current CONFIG_KASAN config option into two:
      1. CONFIG_KASAN_GENERIC, that enables the generic KASAN mode (the one
         that exists now);
      2. CONFIG_KASAN_SW_TAGS, that enables the software tag-based KASAN mode.
      
      The name CONFIG_KASAN_SW_TAGS is chosen as in the future we will have
      another hardware tag-based KASAN mode, that will rely on hardware memory
      tagging support in arm64.
      
      With CONFIG_KASAN_SW_TAGS enabled, compiler options are changed to
      instrument kernel files with -fsantize=kernel-hwaddress (except the ones
      for which KASAN_SANITIZE := n is set).
      
      Both CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS support both
      CONFIG_KASAN_INLINE and CONFIG_KASAN_OUTLINE instrumentation modes.
      
      This commit also adds empty placeholder (for now) implementation of
      tag-based KASAN specific hooks inserted by the compiler and adjusts
      common hooks implementation.
      
      While this commit adds the CONFIG_KASAN_SW_TAGS config option, this option
      is not selectable, as it depends on HAVE_ARCH_KASAN_SW_TAGS, which we will
      enable once all the infrastracture code has been added.
      
      Link: http://lkml.kernel.org/r/b2550106eb8a68b10fefbabce820910b115aa853.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      2bd926b4
    • Andrey Konovalov's avatar
      kasan: rename source files to reflect the new naming scheme · b938fcf4
      Andrey Konovalov authored
      
      
      We now have two KASAN modes: generic KASAN and tag-based KASAN.  Rename
      kasan.c to generic.c to reflect that.  Also rename kasan_init.c to init.c
      as it contains initialization code for both KASAN modes.
      
      Link: http://lkml.kernel.org/r/88c6fd2a883e459e6242030497230e5fb0d44d44.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      b938fcf4
    • Andrey Konovalov's avatar
      kasan: move common generic and tag-based code to common.c · bffa986c
      Andrey Konovalov authored
      
      
      Tag-based KASAN reuses a significant part of the generic KASAN code, so
      move the common parts to common.c without any functional changes.
      
      Link: http://lkml.kernel.org/r/114064d002356e03bb8cc91f7835e20dc61b51d9.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      bffa986c
    • Andrey Konovalov's avatar
      kasan, slub: handle pointer tags in early_kmem_cache_node_alloc · 12b22386
      Andrey Konovalov authored
      
      
      The previous patch updated KASAN hooks signatures and their usage in SLAB
      and SLUB code, except for the early_kmem_cache_node_alloc function.  This
      patch handles that function separately, as it requires to reorder some of
      the initialization code to correctly propagate a tagged pointer in case a
      tag is assigned by kasan_kmalloc.
      
      Link: http://lkml.kernel.org/r/fc8d0fdcf733a7a52e8d0daaa650f4736a57de8c.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      12b22386
    • Andrey Konovalov's avatar
      kasan, mm: change hooks signatures · 0116523c
      Andrey Konovalov authored
      
      
      Patch series "kasan: add software tag-based mode for arm64", v13.
      
      This patchset adds a new software tag-based mode to KASAN [1].  (Initially
      this mode was called KHWASAN, but it got renamed, see the naming rationale
      at the end of this section).
      
      The plan is to implement HWASan [2] for the kernel with the incentive,
      that it's going to have comparable to KASAN performance, but in the same
      time consume much less memory, trading that off for somewhat imprecise bug
      detection and being supported only for arm64.
      
      The underlying ideas of the approach used by software tag-based KASAN are:
      
      1. By using the Top Byte Ignore (TBI) arm64 CPU feature, we can store
         pointer tags in the top byte of each kernel pointer.
      
      2. Using shadow memory, we can store memory tags for each chunk of kernel
         memory.
      
      3. On each memory allocation, we can generate a random tag, embed it into
         the returned pointer and set the memory tags that correspond to this
         chunk of memory to the same value.
      
      4. By using compiler instrumentation, before each memory access we can add
         a check that the pointer tag matches the tag of the memory that is being
         accessed.
      
      5. On a tag mismatch we report an error.
      
      With this patchset the existing KASAN mode gets renamed to generic KASAN,
      with the word "generic" meaning that the implementation can be supported
      by any architecture as it is purely software.
      
      The new mode this patchset adds is called software tag-based KASAN.  The
      word "tag-based" refers to the fact that this mode uses tags embedded into
      the top byte of kernel pointers and the TBI arm64 CPU feature that allows
      to dereference such pointers.  The word "software" here means that shadow
      memory manipulation and tag checking on pointer dereference is done in
      software.  As it is the only tag-based implementation right now, "software
      tag-based" KASAN is sometimes referred to as simply "tag-based" in this
      patchset.
      
      A potential expansion of this mode is a hardware tag-based mode, which
      would use hardware memory tagging support (announced by Arm [3]) instead
      of compiler instrumentation and manual shadow memory manipulation.
      
      Same as generic KASAN, software tag-based KASAN is strictly a debugging
      feature.
      
      [1] https://www.kernel.org/doc/html/latest/dev-tools/kasan.html
      
      [2] http://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html
      
      [3] https://community.arm.com/processors/b/blog/posts/arm-a-profile-architecture-2018-developments-armv85a
      
      ====== Rationale
      
      On mobile devices generic KASAN's memory usage is significant problem.
      One of the main reasons to have tag-based KASAN is to be able to perform a
      similar set of checks as the generic one does, but with lower memory
      requirements.
      
      Comment from Vishwath Mohan <vishwath@google.com>:
      
      I don't have data on-hand, but anecdotally both ASAN and KASAN have proven
      problematic to enable for environments that don't tolerate the increased
      memory pressure well.  This includes
      
      (a) Low-memory form factors - Wear, TV, Things, lower-tier phones like Go,
      (c) Connected components like Pixel's visual core [1].
      
      These are both places I'd love to have a low(er) memory footprint option at
      my disposal.
      
      Comment from Evgenii Stepanov <eugenis@google.com>:
      
      Looking at a live Android device under load, slab (according to
      /proc/meminfo) + kernel stack take 8-10% available RAM (~350MB).  KASAN's
      overhead of 2x - 3x on top of it is not insignificant.
      
      Not having this overhead enables near-production use - ex.  running
      KASAN/KHWASAN kernel on a personal, daily-use device to catch bugs that do
      not reproduce in test configuration.  These are the ones that often cost
      the most engineering time to track down.
      
      CPU overhead is bad, but generally tolerable.  RAM is critical, in our
      experience.  Once it gets low enough, OOM-killer makes your life
      miserable.
      
      [1] https://www.blog.google/products/pixel/pixel-visual-core-image-processing-and-machine-learning-pixel-2/
      
      ====== Technical details
      
      Software tag-based KASAN mode is implemented in a very similar way to the
      generic one. This patchset essentially does the following:
      
      1. TCR_TBI1 is set to enable Top Byte Ignore.
      
      2. Shadow memory is used (with a different scale, 1:16, so each shadow
         byte corresponds to 16 bytes of kernel memory) to store memory tags.
      
      3. All slab objects are aligned to shadow scale, which is 16 bytes.
      
      4. All pointers returned from the slab allocator are tagged with a random
         tag and the corresponding shadow memory is poisoned with the same value.
      
      5. Compiler instrumentation is used to insert tag checks. Either by
         calling callbacks or by inlining them (CONFIG_KASAN_OUTLINE and
         CONFIG_KASAN_INLINE flags are reused).
      
      6. When a tag mismatch is detected in callback instrumentation mode
         KASAN simply prints a bug report. In case of inline instrumentation,
         clang inserts a brk instruction, and KASAN has it's own brk handler,
         which reports the bug.
      
      7. The memory in between slab objects is marked with a reserved tag, and
         acts as a redzone.
      
      8. When a slab object is freed it's marked with a reserved tag.
      
      Bug detection is imprecise for two reasons:
      
      1. We won't catch some small out-of-bounds accesses, that fall into the
         same shadow cell, as the last byte of a slab object.
      
      2. We only have 1 byte to store tags, which means we have a 1/256
         probability of a tag match for an incorrect access (actually even
         slightly less due to reserved tag values).
      
      Despite that there's a particular type of bugs that tag-based KASAN can
      detect compared to generic KASAN: use-after-free after the object has been
      allocated by someone else.
      
      ====== Testing
      
      Some kernel developers voiced a concern that changing the top byte of
      kernel pointers may lead to subtle bugs that are difficult to discover.
      To address this concern deliberate testing has been performed.
      
      It doesn't seem feasible to do some kind of static checking to find
      potential issues with pointer tagging, so a dynamic approach was taken.
      All pointer comparisons/subtractions have been instrumented in an LLVM
      compiler pass and a kernel module that would print a bug report whenever
      two pointers with different tags are being compared/subtracted (ignoring
      comparisons with NULL pointers and with pointers obtained by casting an
      error code to a pointer type) has been used.  Then the kernel has been
      booted in QEMU and on an Odroid C2 board and syzkaller has been run.
      
      This yielded the following results.
      
      The two places that look interesting are:
      
      is_vmalloc_addr in include/linux/mm.h
      is_kernel_rodata in mm/util.c
      
      Here we compare a pointer with some fixed untagged values to make sure
      that the pointer lies in a particular part of the kernel address space.
      Since tag-based KASAN doesn't add tags to pointers that belong to rodata
      or vmalloc regions, this should work as is.  To make sure debug checks to
      those two functions that check that the result doesn't change whether we
      operate on pointers with or without untagging has been added.
      
      A few other cases that don't look that interesting:
      
      Comparing pointers to achieve unique sorting order of pointee objects
      (e.g. sorting locks addresses before performing a double lock):
      
      tty_ldisc_lock_pair_timeout in drivers/tty/tty_ldisc.c
      pipe_double_lock in fs/pipe.c
      unix_state_double_lock in net/unix/af_unix.c
      lock_two_nondirectories in fs/inode.c
      mutex_lock_double in kernel/events/core.c
      
      ep_cmp_ffd in fs/eventpoll.c
      fsnotify_compare_groups fs/notify/mark.c
      
      Nothing needs to be done here, since the tags embedded into pointers
      don't change, so the sorting order would still be unique.
      
      Checks that a pointer belongs to some particular allocation:
      
      is_sibling_entry in lib/radix-tree.c
      object_is_on_stack in include/linux/sched/task_stack.h
      
      Nothing needs to be done here either, since two pointers can only belong
      to the same allocation if they have the same tag.
      
      Overall, since the kernel boots and works, there are no critical bugs.
      As for the rest, the traditional kernel testing way (use until fails) is
      the only one that looks feasible.
      
      Another point here is that tag-based KASAN is available under a separate
      config option that needs to be deliberately enabled. Even though it might
      be used in a "near-production" environment to find bugs that are not found
      during fuzzing or running tests, it is still a debug tool.
      
      ====== Benchmarks
      
      The following numbers were collected on Odroid C2 board. Both generic and
      tag-based KASAN were used in inline instrumentation mode.
      
      Boot time [1]:
      * ~1.7 sec for clean kernel
      * ~5.0 sec for generic KASAN
      * ~5.0 sec for tag-based KASAN
      
      Network performance [2]:
      * 8.33 Gbits/sec for clean kernel
      * 3.17 Gbits/sec for generic KASAN
      * 2.85 Gbits/sec for tag-based KASAN
      
      Slab memory usage after boot [3]:
      * ~40 kb for clean kernel
      * ~105 kb (~260% overhead) for generic KASAN
      * ~47 kb (~20% overhead) for tag-based KASAN
      
      KASAN memory overhead consists of three main parts:
      1. Increased slab memory usage due to redzones.
      2. Shadow memory (the whole reserved once during boot).
      3. Quaratine (grows gradually until some preset limit; the more the limit,
         the more the chance to detect a use-after-free).
      
      Comparing tag-based vs generic KASAN for each of these points:
      1. 20% vs 260% overhead.
      2. 1/16th vs 1/8th of physical memory.
      3. Tag-based KASAN doesn't require quarantine.
      
      [1] Time before the ext4 driver is initialized.
      [2] Measured as `iperf -s & iperf -c 127.0.0.1 -t 30`.
      [3] Measured as `cat /proc/meminfo | grep Slab`.
      
      ====== Some notes
      
      A few notes:
      
      1. The patchset can be found here:
         https://github.com/xairy/kasan-prototype/tree/khwasan
      
      2. Building requires a recent Clang version (7.0.0 or later).
      
      3. Stack instrumentation is not supported yet and will be added later.
      
      This patch (of 25):
      
      Tag-based KASAN changes the value of the top byte of pointers returned
      from the kernel allocation functions (such as kmalloc).  This patch
      updates KASAN hooks signatures and their usage in SLAB and SLUB code to
      reflect that.
      
      Link: http://lkml.kernel.org/r/aec2b5e3973781ff8a6bb6760f8543643202c451.1544099024.git.andreyknvl@google.com
      Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      0116523c
  2. Dec 28, 2018
    • Linus Torvalds's avatar
      Merge tag 'locks-v4.21-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux · 00c569b5
      Linus Torvalds authored
      Pull file locking updates from Jeff Layton:
       "The main change in this set is Neil Brown's work to reduce the
        thundering herd problem when a heavily-contended file lock is
        released.
      
        Previously we'd always wake up all waiters when this occurred. With
        this set, we'll now we only wake up waiters that were blocked on the
        range being released"
      
      * tag 'locks-v4.21-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux:
        locks: Use inode_is_open_for_write
        fs/locks: remove unnecessary white space.
        fs/locks: merge posix_unblock_lock() and locks_delete_block()
        fs/locks: create a tree of dependent requests.
        fs/locks: change all *_conflict() functions to return bool.
        fs/locks: always delete_block after waiting.
        fs/locks: allow a lock request to block other requests.
        fs/locks: use properly initialized file_lock when unlocking.
        ocfs2: properly initial file_lock used for unlock.
        gfs2: properly initial file_lock used for unlock.
        NFS: use locks_copy_lock() to copy locks.
        fs/locks: split out __locks_wake_up_blocks().
        fs/locks: rename some lists and pointers.
      00c569b5
    • Linus Torvalds's avatar
      Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 · f6b1495f
      Linus Torvalds authored
      Pull ext4 updates from Ted Ts'o:
       "All cleanups and bug fixes; most notably, fix some problems discovered
        in ext4's NFS support, and fix an ioctl (EXT4_IOC_GROUP_ADD) used by
        old versions of e2fsprogs which we accidentally broke a while back.
      
        Also fixed some error paths in ext4's quota and inline data support.
      
        Finally, improve tail latency in jbd2's commit code"
      
      * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
        ext4: check for shutdown and r/o file system in ext4_write_inode()
        ext4: force inode writes when nfsd calls commit_metadata()
        ext4: avoid declaring fs inconsistent due to invalid file handles
        ext4: include terminating u32 in size of xattr entries when expanding inodes
        ext4: compare old and new mode before setting update_mode flag
        ext4: fix EXT4_IOC_GROUP_ADD ioctl
        ext4: hard fail dax mount on unsupported devices
        jbd2: update locking documentation for transaction_t
        ext4: remove redundant condition check
        jbd2: clean up indentation issue, replace spaces with tab
        ext4: clean up indentation issues, remove extraneous tabs
        ext4: missing unlock/put_page() in ext4_try_to_write_inline_data()
        ext4: fix possible use after free in ext4_quota_enable
        jbd2: avoid long hold times of j_state_lock while committing a transaction
        ext4: add ext4_sb_bread() to disambiguate ENOMEM cases
      f6b1495f
    • Linus Torvalds's avatar
      Merge tag 'iomap-4.21-merge-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux · bc77789a
      Linus Torvalds authored
      Pull iomap update from Darrick Wong:
       "Fix a memory overflow bug for blocksize < pagesize"
      
      * tag 'iomap-4.21-merge-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
        iomap: don't search past page end in iomap_is_partially_uptodate
      bc77789a
    • Linus Torvalds's avatar
      Merge tag 'xfs-4.21-merge-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux · 47a43f2f
      Linus Torvalds authored
      Pull XFS updates from Darrick Wong:
      
       - Fix CoW remapping of extremely fragmented file areas
      
       - Fix a zero-length symlink verifier error
      
       - Constify some of the rmap owner structures for per-AG metadata
      
       - Precalculate inode geometry for later use
      
       - Fix scrub counting problems
      
       - Don't crash when rtsummary inode is null
      
       - Fix x32 ioctl operation
      
       - Fix enum->string mappings for ftrace output
      
       - Cache realtime summary information in memory
      
      * tag 'xfs-4.21-merge-2' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: (24 commits)
        xfs: reallocate realtime summary cache on growfs
        xfs: stringify scrub types in ftrace output
        xfs: stringify btree cursor types in ftrace output
        xfs: move XFS_INODE_FORMAT_STR mappings to libxfs
        xfs: move XFS_AG_BTREE_CMP_FORMAT_STR mappings to libxfs
        xfs: fix symbolic enum printing in ftrace output
        xfs: fix function pointer type in ftrace format
        xfs: Fix x32 ioctls when cmd numbers differ from ia32.
        xfs: Fix bulkstat compat ioctls on x32 userspace.
        xfs: Align compat attrlist_by_handle with native implementation.
        xfs: require both realtime inodes to mount
        xfs: cache minimum realtime summary level
        xfs: count inode blocks correctly in inobt scrub
        xfs: precalculate cluster alignment in inodes and blocks
        xfs: precalculate inodes and blocks per inode cluster
        xfs: add a block to inode count converter
        xfs: remove xfs_rmap_ag_owner and friends
        xfs: const-ify xfs_owner_info arguments
        xfs: streamline defer op type handling
        xfs: idiotproof defer op type configuration
        ...
      47a43f2f
    • Linus Torvalds's avatar
      Merge tag 'fs_for_4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs · e01799ac
      Linus Torvalds authored
      Pull ext2, udf, and quota update from Jan Kara:
       "Some ext2 cleanups, a fix for UDF crash on corrupted media, and one
        quota locking fix"
      
      * tag 'fs_for_4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
        quota: Lock s_umount in exclusive mode for Q_XQUOTA{ON,OFF} quotactls.
        udf: Fix BUG on corrupted inode
        ext2: change reusable parameter to true when calling mb_cache_entry_create()
        ext2: remove redundant condition check
        ext2: avoid unnecessary operation in ext2_error()
      e01799ac