https://github.com/torvalds/linux
Revision 8d2c0d36d6826ddc3114801c599619d3f2932f0a authored by Linus Torvalds on 25 September 2016, 20:32:46 UTC, committed by Linus Torvalds on 25 September 2016, 20:32:46 UTC
The fixes to the radix tree test suite show that the multi-order case is
broken.  The basic reason is that the radix tree code uses tagged
pointers with the "internal" bit in the low bits, and calculating the
pointer indices was supposed to mask off those bits.  But gcc will
notice that we then use the index to re-create the pointer, and will
avoid doing the arithmetic and use the tagged pointer directly.

This cleans the code up, using the existing is_sibling_entry() helper to
validate the sibling pointer range (instead of open-coding it), and
using entry_to_node() to mask off the low tag bit from the pointer.  And
once you do that, you might as well just use the now cleaned-up pointer
directly.

[ Side note: the multi-order code isn't actually ever used in the kernel
  right now, and the only reason I didn't just delete all that code is
  that Kirill Shutemov piped up and said:

    "Well, my ext4-with-huge-pages patchset[1] uses multi-order entries.
     It also converts shmem-with-huge-pages and hugetlb to them.

     I'm okay with converting it to other mechanism, but I need
     something.  (I looked into Konstantin's RFC patchset[2].  It looks
     okay, but I don't feel myself qualified to review it as I don't
     know much about radix-tree internals.)"

  [1] http://lkml.kernel.org/r/20160915115523.29737-1-kirill.shutemov@linux.intel.com
  [2] http://lkml.kernel.org/r/147230727479.9957.1087787722571077339.stgit@zurg ]

Reported-by: Matthew Wilcox <mawilcox@microsoft.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Cedric Blancher <cedric.blancher@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 62fd525
History
Tip revision: 8d2c0d36d6826ddc3114801c599619d3f2932f0a authored by Linus Torvalds on 25 September 2016, 20:32:46 UTC
radix tree: fix sibling entry handling in radix_tree_descend()
Tip revision: 8d2c0d3
File Mode Size
basic
coccinelle
dtc
gcc-plugins
gdb
genksyms
kconfig
ksymoops
mod
package
selinux
tracing
.gitignore -rw-r--r-- 170 bytes
Kbuild.include -rw-r--r-- 14.9 KB
Lindent -rwxr-xr-x 496 bytes
Makefile -rw-r--r-- 1.8 KB
Makefile.asm-generic -rw-r--r-- 1.1 KB
Makefile.build -rw-r--r-- 14.5 KB
Makefile.clean -rw-r--r-- 2.9 KB
Makefile.dtbinst -rw-r--r-- 1.2 KB
Makefile.extrawarn -rw-r--r-- 2.5 KB
Makefile.fwinst -rw-r--r-- 2.0 KB
Makefile.gcc-plugins -rw-r--r-- 2.2 KB
Makefile.headersinst -rw-r--r-- 4.7 KB
Makefile.help -rw-r--r-- 68 bytes
Makefile.host -rw-r--r-- 6.8 KB
Makefile.kasan -rw-r--r-- 934 bytes
Makefile.lib -rw-r--r-- 14.5 KB
Makefile.modbuiltin -rw-r--r-- 1.8 KB
Makefile.modinst -rw-r--r-- 1.2 KB
Makefile.modpost -rw-r--r-- 5.3 KB
Makefile.modsign -rw-r--r-- 1005 bytes
Makefile.ubsan -rw-r--r-- 830 bytes
adjust_autoksyms.sh -rwxr-xr-x 2.7 KB
analyze_suspend.py -rwxr-xr-x 157.1 KB
asn1_compiler.c -rw-r--r-- 35.5 KB
bloat-o-meter -rwxr-xr-x 2.1 KB
bootgraph.pl -rwxr-xr-x 6.3 KB
check-lc_ctype.c -rw-r--r-- 201 bytes
check_extable.sh -rwxr-xr-x 4.9 KB
checkincludes.pl -rwxr-xr-x 1.8 KB
checkkconfigsymbols.py -rwxr-xr-x 15.4 KB
checkpatch.pl -rwxr-xr-x 176.7 KB
checkstack.pl -rwxr-xr-x 5.4 KB
checksyscalls.sh -rwxr-xr-x 5.6 KB
checkversion.pl -rwxr-xr-x 1.9 KB
cleanfile -rwxr-xr-x 3.4 KB
cleanpatch -rwxr-xr-x 5.0 KB
coccicheck -rwxr-xr-x 7.1 KB
config -rwxr-xr-x 4.5 KB
conmakehash.c -rw-r--r-- 6.0 KB
decode_stacktrace.sh -rwxr-xr-x 3.7 KB
decodecode -rwxr-xr-x 2.1 KB
depmod.sh -rwxr-xr-x 1.7 KB
diffconfig -rwxr-xr-x 3.7 KB
docproc.c -rw-r--r-- 15.5 KB
export_report.pl -rwxr-xr-x 4.5 KB
extract-cert.c -rw-r--r-- 3.5 KB
extract-ikconfig -rwxr-xr-x 1.7 KB
extract-module-sig.pl -rwxr-xr-x 3.6 KB
extract-sys-certs.pl -rwxr-xr-x 3.7 KB
extract-vmlinux -rwxr-xr-x 1.6 KB
extract_xc3028.pl -rwxr-xr-x 44.6 KB
faddr2line -rwxr-xr-x 4.8 KB
gcc-goto.sh -rwxr-xr-x 495 bytes
gcc-ld -rwxr-xr-x 676 bytes
gcc-plugin.sh -rwxr-xr-x 1.0 KB
gcc-version.sh -rwxr-xr-x 822 bytes
gcc-x86_32-has-stack-protector.sh -rwxr-xr-x 184 bytes
gcc-x86_64-has-stack-protector.sh -rwxr-xr-x 200 bytes
gen_initramfs_list.sh -rwxr-xr-x 7.9 KB
get_dvb_firmware -rwxr-xr-x 25.2 KB
get_maintainer.pl -rwxr-xr-x 58.9 KB
gfp-translate -rwxr-xr-x 1.7 KB
headerdep.pl -rwxr-xr-x 3.5 KB
headers.sh -rwxr-xr-x 477 bytes
headers_check.pl -rwxr-xr-x 3.7 KB
headers_install.sh -rwxr-xr-x 1.3 KB
insert-sys-cert.c -rw-r--r-- 8.9 KB
kallsyms.c -rw-r--r-- 18.5 KB
kernel-doc -rwxr-xr-x 87.4 KB
kernel-doc-xml-ref -rwxr-xr-x 4.2 KB
ld-version.sh -rwxr-xr-x 234 bytes
link-vmlinux.sh -rwxr-xr-x 5.9 KB
makelst -rwxr-xr-x 773 bytes
markup_oops.pl -rwxr-xr-x 8.1 KB
mkcompile_h -rwxr-xr-x 2.5 KB
mkmakefile -rwxr-xr-x 1.2 KB
mksysmap -rwxr-xr-x 1.3 KB
mkuboot.sh -rwxr-xr-x 379 bytes
mkversion -rw-r--r-- 74 bytes
module-common.lds -rw-r--r-- 833 bytes
namespace.pl -rwxr-xr-x 13.1 KB
objdiff -rwxr-xr-x 2.7 KB
patch-kernel -rwxr-xr-x 9.9 KB
pnmtologo.c -rw-r--r-- 11.9 KB
profile2linkerlist.pl -rwxr-xr-x 375 bytes
prune-kernel -rwxr-xr-x 673 bytes
recordmcount.c -rw-r--r-- 15.0 KB
recordmcount.h -rw-r--r-- 16.4 KB
recordmcount.pl -rwxr-xr-x 17.9 KB
setlocalversion -rwxr-xr-x 3.9 KB
show_delta -rwxr-xr-x 3.0 KB
sign-file.c -rwxr-xr-x 9.7 KB
sortextable.c -rw-r--r-- 8.3 KB
sortextable.h -rw-r--r-- 5.5 KB
spelling.txt -rw-r--r-- 21.3 KB
stackdelta -rwxr-xr-x 1.8 KB
stackusage -rwxr-xr-x 759 bytes
tags.sh -rwxr-xr-x 9.0 KB
unifdef.c -rw-r--r-- 34.8 KB
ver_linux -rwxr-xr-x 3.9 KB
xen-hypercalls.sh -rw-r--r-- 351 bytes
xz_wrap.sh -rwxr-xr-x 562 bytes

back to top