Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
- index 105ae30a176b..e815ff04f1ff 100644
- --- a/arch/x86/Kconfig
- +++ b/arch/x86/Kconfig
- @@ -73,7 +73,7 @@ config X86
- select HAVE_PERF_USER_STACK_DUMP
- select HAVE_DEBUG_KMEMLEAK
- select ANON_INODES
- - select HAVE_ALIGNED_STRUCT_PAGE if SLUB
- + select HAVE_ALIGNED_STRUCT_PAGE if SLUB && !LFS_ON_32CPU
- select HAVE_CMPXCHG_LOCAL
- select HAVE_CMPXCHG_DOUBLE
- select HAVE_ARCH_KMEMCHECK
- diff --git a/fs/Kconfig b/fs/Kconfig
- index c229f828eb01..40ae93d0a8ae 100644
- --- a/fs/Kconfig
- +++ b/fs/Kconfig
- @@ -10,6 +10,16 @@ config DCACHE_WORD_ACCESS
- if BLOCK
- +config LFS_ON_32CPU
- + bool "Support for large (16TB+) filesystems on 32-bit cpu"
- + depends on (ARCH_ALPINE || SYNO_HI3536) && LBDAF
- + depends on !HUGETLBFS #hugetlbfs not supported yet
- + default n
- + help
- + Enable support of running filesystem on block devices that are larger
- + than 16TB on 32bit cpus
- +
- +
- source "fs/ext2/Kconfig"
- source "fs/ext3/Kconfig"
- source "fs/ext4/Kconfig"
- diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h
- index e02e09f85fad..bada80dea806 100644
- --- a/include/linux/radix-tree.h
- +++ b/include/linux/radix-tree.h
- @@ -1,23 +1,7 @@
- -/*
- - * Copyright (C) 2001 Momchil Velikov
- - * Portions Copyright (C) 2001 Christoph Hellwig
- - * Copyright (C) 2006 Nick Piggin
- - * Copyright (C) 2012 Konstantin Khlebnikov
- - *
- - * This program is free software; you can redistribute it and/or
- - * modify it under the terms of the GNU General Public License as
- - * published by the Free Software Foundation; either version 2, or (at
- - * your option) any later version.
- - *
- - * This program is distributed in the hope that it will be useful, but
- - * WITHOUT ANY WARRANTY; without even the implied warranty of
- - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- - * General Public License for more details.
- - *
- - * You should have received a copy of the GNU General Public License
- - * along with this program; if not, write to the Free Software
- - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- - */
- +#ifndef MY_ABC_HERE
- +#define MY_ABC_HERE
- +#endif
- +
- #ifndef _LINUX_RADIX_TREE_H
- #define _LINUX_RADIX_TREE_H
- @@ -27,27 +11,19 @@
- #include <linux/kernel.h>
- #include <linux/rcupdate.h>
- -/*
- - * An indirect pointer (root->rnode pointing to a radix_tree_node, rather
- - * than a data item) is signalled by the low bit set in the root->rnode
- - * pointer.
- - *
- - * In this case root->height is > 0, but the indirect pointer tests are
- - * needed for RCU lookups (because root->height is unreliable). The only
- - * time callers need worry about this is when doing a lookup_slot under
- - * RCU.
- - *
- - * Indirect pointer in fact is also used to tag the last pointer of a node
- - * when it is shrunk, before we rcu free the node. See shrink code for
- - * details.
- - */
- +#ifdef CONFIG_LFS_ON_32CPU
- +
- +#define rdx_t unsigned long long
- +#define RDX_TREE_KEY_MAX_VALUE ULLONG_MAX
- +#else
- +#if defined(MY_ABC_HERE)
- +#define rdx_t unsigned long
- +#define RDX_TREE_KEY_MAX_VALUE ULONG_MAX
- +#endif
- +#endif
- +
- #define RADIX_TREE_INDIRECT_PTR 1
- -/*
- - * A common use of the radix tree is to store pointers to struct pages;
- - * but shmem/tmpfs needs also to store swap entries in the same tree:
- - * those are marked as exceptional entries to distinguish them.
- - * EXCEPTIONAL_ENTRY tests the bit, EXCEPTIONAL_SHIFT shifts content past it.
- - */
- +
- #define RADIX_TREE_EXCEPTIONAL_ENTRY 2
- #define RADIX_TREE_EXCEPTIONAL_SHIFT 2
- diff --git a/include/linux/types.h b/include/linux/types.h
- index 83db8e5974dc..d62addfb19d0 100644
- --- a/include/linux/types.h
- +++ b/include/linux/types.h
- @@ -1,3 +1,6 @@
- +#ifndef MY_ABC_HERE
- +#define MY_ABC_HERE
- +#endif
- #ifndef _LINUX_TYPES_H
- #define _LINUX_TYPES_H
- @@ -134,19 +122,23 @@ typedef unsigned long sector_t;
- typedef unsigned long blkcnt_t;
- #endif
- -/*
- - * The type of an index into the pagecache. Use a #define so asm/types.h
- - * can override it.
- - */
- #ifndef pgoff_t
- +#ifdef CONFIG_LFS_ON_32CPU
- +#define pgoff_t unsigned long long
- +#define PGOFF_MAX ULLONG_MAX
- +#else
- #define pgoff_t unsigned long
- +#if defined(MY_ABC_HERE)
- +#define PGOFF_MAX ULONG_MAX
- +#endif
- +#endif
- #endif
- #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
- typedef u64 dma_addr_t;
- #else
- typedef u32 dma_addr_t;
- -#endif /* dma_addr_t */
- +#endif
- #ifdef __CHECKER__
- #else
- diff --git a/lib/radix-tree.c b/lib/radix-tree.c
- index 936a02c1c77b..2ef38ec81e30 100644
- --- a/lib/radix-tree.c
- +++ b/lib/radix-tree.c
- @@ -1,25 +1,7 @@
- -/*
- - * Copyright (C) 2001 Momchil Velikov
- - * Portions Copyright (C) 2001 Christoph Hellwig
- - * Copyright (C) 2005 SGI, Christoph Lameter
- - * Copyright (C) 2006 Nick Piggin
- - * Copyright (C) 2012 Konstantin Khlebnikov
- - *
- - * This program is free software; you can redistribute it and/or
- - * modify it under the terms of the GNU General Public License as
- - * published by the Free Software Foundation; either version 2, or (at
- - * your option) any later version.
- - *
- - * This program is distributed in the hope that it will be useful, but
- - * WITHOUT ANY WARRANTY; without even the implied warranty of
- - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- - * General Public License for more details.
- - *
- - * You should have received a copy of the GNU General Public License
- - * along with this program; if not, write to the Free Software
- - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- - */
- -
- +#ifndef MY_ABC_HERE
- +#define MY_ABC_HERE
- +#endif
- +
- #include <linux/errno.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
- @@ -33,61 +15,66 @@
- #include <linux/bitops.h>
- #include <linux/rcupdate.h>
- +#ifdef CONFIG_LFS_ON_32CPU
- +#define RADIX_TREE_1 1ULL
- +#define RADIX_TREE_BITS_PER_KEY 64
- +#else
- +#if defined(MY_ABC_HERE)
- +#define RADIX_TREE_1 1UL
- +#define RADIX_TREE_BITS_PER_KEY BITS_PER_LONG
- +#endif
- +#endif
- #ifdef __KERNEL__
- #define RADIX_TREE_MAP_SHIFT (CONFIG_BASE_SMALL ? 4 : 6)
- #else
- -#define RADIX_TREE_MAP_SHIFT 3 /* For more stressful testing */
- +#define RADIX_TREE_MAP_SHIFT 3
- #endif
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +#define RADIX_TREE_MAP_SIZE (RADIX_TREE_1 << RADIX_TREE_MAP_SHIFT)
- +#else
- #define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT)
- +#endif
- #define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1)
- #define RADIX_TREE_TAG_LONGS \
- ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
- struct radix_tree_node {
- - unsigned int height; /* Height from the bottom */
- + unsigned int height;
- unsigned int count;
- union {
- - struct radix_tree_node *parent; /* Used when ascending tree */
- - struct rcu_head rcu_head; /* Used when freeing node */
- + struct radix_tree_node *parent;
- + struct rcu_head rcu_head;
- };
- void __rcu *slots[RADIX_TREE_MAP_SIZE];
- unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS];
- };
- -#define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long))
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +#define RADIX_TREE_INDEX_BITS (8 * sizeof(rdx_t))
- +#else
- +#define RADIX_TREE_INDEX_BITS (8 * sizeof(unsigned long))
- +#endif
- #define RADIX_TREE_MAX_PATH (DIV_ROUND_UP(RADIX_TREE_INDEX_BITS, \
- RADIX_TREE_MAP_SHIFT))
- -/*
- - * The height_to_maxindex array needs to be one deeper than the maximum
- - * path as height 0 holds only 1 entry.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +static rdx_t height_to_maxindex[RADIX_TREE_MAX_PATH + 1] __read_mostly;
- +#else
- static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH + 1] __read_mostly;
- +#endif
- -/*
- - * Radix tree node cache.
- - */
- static struct kmem_cache *radix_tree_node_cachep;
- -/*
- - * The radix tree is variable-height, so an insert operation not only has
- - * to build the branch to its corresponding item, it also has to build the
- - * branch to existing items if the size has to be increased (by
- - * radix_tree_extend).
- - *
- - * The worst case is a zero height tree with just a single item at index 0,
- - * and then inserting an item at index ULONG_MAX. This requires 2 new branches
- - * of RADIX_TREE_MAX_PATH size to be created, with only the root node shared.
- - * Hence:
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +
- +#else
- +
- +#endif
- #define RADIX_TREE_PRELOAD_SIZE (RADIX_TREE_MAX_PATH * 2 - 1)
- -/*
- - * Per-cpu pool of preloaded nodes
- - */
- struct radix_tree_preload {
- int nr;
- struct radix_tree_node *nodes[RADIX_TREE_PRELOAD_SIZE];
- @@ -147,10 +134,6 @@ static inline int root_tag_get(struct radix_tree_root *root, unsigned int tag)
- return (__force unsigned)root->gfp_mask & (1 << (tag + __GFP_BITS_SHIFT));
- }
- -/*
- - * Returns 1 if any slot in the node has this tag set.
- - * Otherwise returns 0.
- - */
- static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag)
- {
- int idx;
- @@ -161,17 +144,6 @@ static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag)
- return 0;
- }
- -/**
- - * radix_tree_find_next_bit - find the next set bit in a memory region
- - *
- - * @addr: The address to base the search on
- - * @size: The bitmap size in bits
- - * @offset: The bitnumber to start searching at
- - *
- - * Unrollable variant of find_next_bit() for constant size arrays.
- - * Tail bits starting from size to roundup(size, BITS_PER_LONG) must be zero.
- - * Returns next bit offset, or size if nothing found.
- - */
- static __always_inline unsigned long
- radix_tree_find_next_bit(const unsigned long *addr,
- unsigned long size, unsigned long offset)
- @@ -197,10 +169,6 @@ radix_tree_find_next_bit(const unsigned long *addr,
- return size;
- }
- -/*
- - * This assumes that the caller has performed appropriate preallocation, and
- - * that the caller has pinned this thread of control to the current CPU.
- - */
- static struct radix_tree_node *
- radix_tree_node_alloc(struct radix_tree_root *root)
- {
- @@ -210,11 +178,6 @@ radix_tree_node_alloc(struct radix_tree_root *root)
- if (!(gfp_mask & __GFP_WAIT)) {
- struct radix_tree_preload *rtp;
- - /*
- - * Provided the caller has preloaded here, we will always
- - * succeed in getting a node here (and never reach
- - * kmem_cache_alloc)
- - */
- rtp = &__get_cpu_var(radix_tree_preloads);
- if (rtp->nr) {
- ret = rtp->nodes[rtp->nr - 1];
- @@ -235,11 +198,6 @@ static void radix_tree_node_rcu_free(struct rcu_head *head)
- container_of(head, struct radix_tree_node, rcu_head);
- int i;
- - /*
- - * must only free zeroed nodes into the slab. radix_tree_shrink
- - * can leave us with a non-NULL entry in the first slot, so clear
- - * that here to make sure.
- - */
- for (i = 0; i < RADIX_TREE_MAX_TAGS; i++)
- tag_clear(node, i, 0);
- @@ -255,15 +213,6 @@ radix_tree_node_free(struct radix_tree_node *node)
- call_rcu(&node->rcu_head, radix_tree_node_rcu_free);
- }
- -/*
- - * Load up this CPU's radix_tree_node buffer with sufficient objects to
- - * ensure that the addition of a single element in the tree cannot fail. On
- - * success, return zero, with preemption disabled. On error, return -ENOMEM
- - * with preemption not disabled.
- - *
- - * To make use of this facility, the radix tree must be initialised without
- - * __GFP_WAIT being passed to INIT_RADIX_TREE().
- - */
- int radix_tree_preload(gfp_t gfp_mask)
- {
- struct radix_tree_preload *rtp;
- @@ -290,26 +239,26 @@ out:
- }
- EXPORT_SYMBOL(radix_tree_preload);
- -/*
- - * Return the maximum key which can be store into a
- - * radix tree with height HEIGHT.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +static inline rdx_t radix_tree_maxindex(unsigned int height)
- +#else
- static inline unsigned long radix_tree_maxindex(unsigned int height)
- +#endif
- {
- return height_to_maxindex[height];
- }
- -/*
- - * Extend a radix tree so it can store key @index.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +static int radix_tree_extend(struct radix_tree_root *root, rdx_t index)
- +#else
- static int radix_tree_extend(struct radix_tree_root *root, unsigned long index)
- +#endif
- {
- struct radix_tree_node *node;
- struct radix_tree_node *slot;
- unsigned int height;
- int tag;
- - /* Figure out what the height should be. */
- height = root->height + 1;
- while (index > radix_tree_maxindex(height))
- height++;
- @@ -324,13 +273,11 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index)
- if (!(node = radix_tree_node_alloc(root)))
- return -ENOMEM;
- - /* Propagate the aggregated tag info into the new root */
- for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) {
- if (root_tag_get(root, tag))
- tag_set(node, tag, 0);
- }
- - /* Increase the height. */
- newheight = root->height+1;
- node->height = newheight;
- node->count = 1;
- @@ -349,16 +296,12 @@ out:
- return 0;
- }
- -/**
- - * radix_tree_insert - insert into a radix tree
- - * @root: radix tree root
- - * @index: index key
- - * @item: item to insert
- - *
- - * Insert an item into the radix tree at position @index.
- - */
- int radix_tree_insert(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index, void *item)
- +#else
- unsigned long index, void *item)
- +#endif
- {
- struct radix_tree_node *node = NULL, *slot;
- unsigned int height, shift;
- @@ -367,7 +310,6 @@ int radix_tree_insert(struct radix_tree_root *root,
- BUG_ON(radix_tree_is_indirect_ptr(item));
- - /* Make sure the tree is high enough. */
- if (index > radix_tree_maxindex(root->height)) {
- error = radix_tree_extend(root, index);
- if (error)
- @@ -379,10 +321,10 @@ int radix_tree_insert(struct radix_tree_root *root,
- height = root->height;
- shift = (height-1) * RADIX_TREE_MAP_SHIFT;
- - offset = 0; /* uninitialised var warning */
- + offset = 0;
- while (height > 0) {
- if (slot == NULL) {
- - /* Have to add a child node. */
- +
- if (!(slot = radix_tree_node_alloc(root)))
- return -ENOMEM;
- slot->height = height;
- @@ -394,7 +336,6 @@ int radix_tree_insert(struct radix_tree_root *root,
- rcu_assign_pointer(root->rnode, ptr_to_indirect(slot));
- }
- - /* Go a level down */
- offset = (index >> shift) & RADIX_TREE_MAP_MASK;
- node = slot;
- slot = node->slots[offset];
- @@ -420,12 +361,12 @@ int radix_tree_insert(struct radix_tree_root *root,
- }
- EXPORT_SYMBOL(radix_tree_insert);
- -/*
- - * is_slot == 1 : search for the slot.
- - * is_slot == 0 : search for the node.
- - */
- static void *radix_tree_lookup_element(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index, int is_slot)
- +#else
- unsigned long index, int is_slot)
- +#endif
- {
- unsigned int height, shift;
- struct radix_tree_node *node, **slot;
- @@ -461,58 +402,32 @@ static void *radix_tree_lookup_element(struct radix_tree_root *root,
- return is_slot ? (void *)slot : indirect_to_ptr(node);
- }
- -/**
- - * radix_tree_lookup_slot - lookup a slot in a radix tree
- - * @root: radix tree root
- - * @index: index key
- - *
- - * Returns: the slot corresponding to the position @index in the
- - * radix tree @root. This is useful for update-if-exists operations.
- - *
- - * This function can be called under rcu_read_lock iff the slot is not
- - * modified by radix_tree_replace_slot, otherwise it must be called
- - * exclusive from other writers. Any dereference of the slot must be done
- - * using radix_tree_deref_slot.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +void **radix_tree_lookup_slot(struct radix_tree_root *root, rdx_t index)
- +#else
- void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index)
- +#endif
- {
- return (void **)radix_tree_lookup_element(root, index, 1);
- }
- EXPORT_SYMBOL(radix_tree_lookup_slot);
- -/**
- - * radix_tree_lookup - perform lookup operation on a radix tree
- - * @root: radix tree root
- - * @index: index key
- - *
- - * Lookup the item at the position @index in the radix tree @root.
- - *
- - * This function can be called under rcu_read_lock, however the caller
- - * must manage lifetimes of leaf nodes (eg. RCU may also be used to free
- - * them safely). No RCU barriers are required to access or modify the
- - * returned item, however.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +void *radix_tree_lookup(struct radix_tree_root *root, rdx_t index)
- +#else
- void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
- +#endif
- {
- return radix_tree_lookup_element(root, index, 0);
- }
- EXPORT_SYMBOL(radix_tree_lookup);
- -/**
- - * radix_tree_tag_set - set a tag on a radix tree node
- - * @root: radix tree root
- - * @index: index key
- - * @tag: tag index
- - *
- - * Set the search tag (which must be < RADIX_TREE_MAX_TAGS)
- - * corresponding to @index in the radix tree. From
- - * the root all the way down to the leaf node.
- - *
- - * Returns the address of the tagged item. Setting a tag on a not-present
- - * item is a bug.
- - */
- void *radix_tree_tag_set(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index, unsigned int tag)
- +#else
- unsigned long index, unsigned int tag)
- +#endif
- {
- unsigned int height, shift;
- struct radix_tree_node *slot;
- @@ -535,7 +450,6 @@ void *radix_tree_tag_set(struct radix_tree_root *root,
- height--;
- }
- - /* set the root's tag bit */
- if (slot && !root_tag_get(root, tag))
- root_tag_set(root, tag);
- @@ -543,22 +457,12 @@ void *radix_tree_tag_set(struct radix_tree_root *root,
- }
- EXPORT_SYMBOL(radix_tree_tag_set);
- -/**
- - * radix_tree_tag_clear - clear a tag on a radix tree node
- - * @root: radix tree root
- - * @index: index key
- - * @tag: tag index
- - *
- - * Clear the search tag (which must be < RADIX_TREE_MAX_TAGS)
- - * corresponding to @index in the radix tree. If
- - * this causes the leaf node to have no tags set then clear the tag in the
- - * next-to-leaf node, etc.
- - *
- - * Returns the address of the tagged item on success, else NULL. ie:
- - * has the same return value and semantics as radix_tree_lookup().
- - */
- void *radix_tree_tag_clear(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index, unsigned int tag)
- +#else
- unsigned long index, unsigned int tag)
- +#endif
- {
- struct radix_tree_node *node = NULL;
- struct radix_tree_node *slot = NULL;
- @@ -597,7 +501,6 @@ void *radix_tree_tag_clear(struct radix_tree_root *root,
- node = node->parent;
- }
- - /* clear the root's tag bit */
- if (root_tag_get(root, tag))
- root_tag_clear(root, tag);
- @@ -606,28 +509,16 @@ out:
- }
- EXPORT_SYMBOL(radix_tree_tag_clear);
- -/**
- - * radix_tree_tag_get - get a tag on a radix tree node
- - * @root: radix tree root
- - * @index: index key
- - * @tag: tag index (< RADIX_TREE_MAX_TAGS)
- - *
- - * Return values:
- - *
- - * 0: tag not present or not set
- - * 1: tag set
- - *
- - * Note that the return value of this function may not be relied on, even if
- - * the RCU lock is held, unless tag modification and node deletion are excluded
- - * from concurrency.
- - */
- int radix_tree_tag_get(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index, unsigned int tag)
- +#else
- unsigned long index, unsigned int tag)
- +#endif
- {
- unsigned int height, shift;
- struct radix_tree_node *node;
- - /* check the root's tag bit */
- if (!root_tag_get(root, tag))
- return 0;
- @@ -663,33 +554,20 @@ int radix_tree_tag_get(struct radix_tree_root *root,
- }
- EXPORT_SYMBOL(radix_tree_tag_get);
- -/**
- - * radix_tree_next_chunk - find next chunk of slots for iteration
- - *
- - * @root: radix tree root
- - * @iter: iterator state
- - * @flags: RADIX_TREE_ITER_* flags and tag index
- - * Returns: pointer to chunk first slot, or NULL if iteration is over
- - */
- void **radix_tree_next_chunk(struct radix_tree_root *root,
- struct radix_tree_iter *iter, unsigned flags)
- {
- unsigned shift, tag = flags & RADIX_TREE_ITER_TAG_MASK;
- struct radix_tree_node *rnode, *node;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index, offset;
- +#else
- unsigned long index, offset;
- +#endif
- if ((flags & RADIX_TREE_ITER_TAGGED) && !root_tag_get(root, tag))
- return NULL;
- - /*
- - * Catch next_index overflow after ~0UL. iter->index never overflows
- - * during iterating; it can be zero only at the beginning.
- - * And we cannot overflow iter->next_index in a single step,
- - * because RADIX_TREE_MAP_SHIFT < BITS_PER_LONG.
- - *
- - * This condition also used by radix_tree_next_slot() to stop
- - * contiguous iterating, and forbid swithing to the next chunk.
- - */
- index = iter->next_index;
- if (!index && iter->index)
- return NULL;
- @@ -698,7 +576,7 @@ void **radix_tree_next_chunk(struct radix_tree_root *root,
- if (radix_tree_is_indirect_ptr(rnode)) {
- rnode = indirect_to_ptr(rnode);
- } else if (rnode && !index) {
- - /* Single-slot tree */
- +
- iter->index = 0;
- iter->next_index = 1;
- iter->tags = 1;
- @@ -710,7 +588,6 @@ restart:
- shift = (rnode->height - 1) * RADIX_TREE_MAP_SHIFT;
- offset = index >> shift;
- - /* Index outside of the tree */
- if (offset >= RADIX_TREE_MAP_SIZE)
- return NULL;
- @@ -719,7 +596,7 @@ restart:
- if ((flags & RADIX_TREE_ITER_TAGGED) ?
- !test_bit(offset, node->tags[tag]) :
- !node->slots[offset]) {
- - /* Hole detected */
- +
- if (flags & RADIX_TREE_ITER_CONTIG)
- return NULL;
- @@ -735,14 +612,13 @@ restart:
- }
- index &= ~((RADIX_TREE_MAP_SIZE << shift) - 1);
- index += offset << shift;
- - /* Overflow after ~0UL */
- +
- if (!index)
- return NULL;
- if (offset == RADIX_TREE_MAP_SIZE)
- goto restart;
- }
- - /* This is leaf-node */
- if (!shift)
- break;
- @@ -753,24 +629,22 @@ restart:
- offset = (index >> shift) & RADIX_TREE_MAP_MASK;
- }
- - /* Update the iterator state */
- iter->index = index;
- iter->next_index = (index | RADIX_TREE_MAP_MASK) + 1;
- - /* Construct iter->tags bit-mask from node->tags[tag] array */
- if (flags & RADIX_TREE_ITER_TAGGED) {
- unsigned tag_long, tag_bit;
- tag_long = offset / BITS_PER_LONG;
- tag_bit = offset % BITS_PER_LONG;
- iter->tags = node->tags[tag][tag_long] >> tag_bit;
- - /* This never happens if RADIX_TREE_TAG_LONGS == 1 */
- +
- if (tag_long < RADIX_TREE_TAG_LONGS - 1) {
- - /* Pick tags from next element */
- +
- if (tag_bit)
- iter->tags |= node->tags[tag][tag_long + 1] <<
- (BITS_PER_LONG - tag_bit);
- - /* Clip chunk size, here only BITS_PER_LONG tags */
- +
- iter->next_index = index + BITS_PER_LONG;
- }
- }
- @@ -779,35 +653,17 @@ restart:
- }
- EXPORT_SYMBOL(radix_tree_next_chunk);
- -/**
- - * radix_tree_range_tag_if_tagged - for each item in given range set given
- - * tag if item has another tag set
- - * @root: radix tree root
- - * @first_indexp: pointer to a starting index of a range to scan
- - * @last_index: last index of a range to scan
- - * @nr_to_tag: maximum number items to tag
- - * @iftag: tag index to test
- - * @settag: tag index to set if tested tag is set
- - *
- - * This function scans range of radix tree from first_index to last_index
- - * (inclusive). For each item in the range if iftag is set, the function sets
- - * also settag. The function stops either after tagging nr_to_tag items or
- - * after reaching last_index.
- - *
- - * The tags must be set from the leaf level only and propagated back up the
- - * path to the root. We must do this so that we resolve the full path before
- - * setting any tags on intermediate nodes. If we set tags as we descend, then
- - * we can get to the leaf node and find that the index that has the iftag
- - * set is outside the range we are scanning. This reults in dangling tags and
- - * can lead to problems with later tag operations (e.g. livelocks on lookups).
- - *
- - * The function returns number of leaves where the tag was set and sets
- - * *first_indexp to the first unscanned index.
- - * WARNING! *first_indexp can wrap if last_index is ULONG_MAX. Caller must
- - * be prepared to handle that.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +
- +#else
- +
- +#endif
- unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t *first_indexp, rdx_t last_index,
- +#else
- unsigned long *first_indexp, unsigned long last_index,
- +#endif
- unsigned long nr_to_tag,
- unsigned int iftag, unsigned int settag)
- {
- @@ -816,7 +672,11 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
- struct radix_tree_node *slot;
- unsigned int shift;
- unsigned long tagged = 0;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t index = *first_indexp;
- +#else
- unsigned long index = *first_indexp;
- +#endif
- last_index = min(last_index, radix_tree_maxindex(height));
- if (index > last_index)
- @@ -837,7 +697,11 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
- slot = indirect_to_ptr(root->rnode);
- for (;;) {
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t upindex;
- +#else
- unsigned long upindex;
- +#endif
- int offset;
- offset = (index >> shift) & RADIX_TREE_MAP_MASK;
- @@ -846,61 +710,44 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
- if (!tag_get(slot, iftag, offset))
- goto next;
- if (shift) {
- - /* Go down one level */
- +
- shift -= RADIX_TREE_MAP_SHIFT;
- node = slot;
- slot = slot->slots[offset];
- continue;
- }
- - /* tag the leaf */
- tagged++;
- tag_set(slot, settag, offset);
- - /* walk back up the path tagging interior nodes */
- upindex = index;
- while (node) {
- upindex >>= RADIX_TREE_MAP_SHIFT;
- offset = upindex & RADIX_TREE_MAP_MASK;
- - /* stop if we find a node with the tag already set */
- if (tag_get(node, settag, offset))
- break;
- tag_set(node, settag, offset);
- node = node->parent;
- }
- - /*
- - * Small optimization: now clear that node pointer.
- - * Since all of this slot's ancestors now have the tag set
- - * from setting it above, we have no further need to walk
- - * back up the tree setting tags, until we update slot to
- - * point to another radix_tree_node.
- - */
- node = NULL;
- next:
- - /* Go to next item at level determined by 'shift' */
- +
- index = ((index >> shift) + 1) << shift;
- - /* Overflow can happen when last_index is ~0UL... */
- +
- if (index > last_index || !index)
- break;
- if (tagged >= nr_to_tag)
- break;
- while (((index >> shift) & RADIX_TREE_MAP_MASK) == 0) {
- - /*
- - * We've fully scanned this node. Go up. Because
- - * last_index is guaranteed to be in the tree, what
- - * we do below cannot wander astray.
- - */
- +
- slot = slot->parent;
- shift += RADIX_TREE_MAP_SHIFT;
- }
- }
- - /*
- - * We need not to tag the root tag if there is no tag which is set with
- - * settag within the range from *first_indexp to last_index.
- - */
- +
- if (tagged > 0)
- root_tag_set(root, settag);
- *first_indexp = index;
- @@ -909,31 +756,17 @@ next:
- }
- EXPORT_SYMBOL(radix_tree_range_tag_if_tagged);
- -
- -/**
- - * radix_tree_next_hole - find the next hole (not-present entry)
- - * @root: tree root
- - * @index: index key
- - * @max_scan: maximum range to search
- - *
- - * Search the set [index, min(index+max_scan-1, MAX_INDEX)] for the lowest
- - * indexed hole.
- - *
- - * Returns: the index of the hole if found, otherwise returns an index
- - * outside of the set specified (in which case 'return - index >= max_scan'
- - * will be true). In rare cases of index wrap-around, 0 will be returned.
- - *
- - * radix_tree_next_hole may be called under rcu_read_lock. However, like
- - * radix_tree_gang_lookup, this will not atomically search a snapshot of
- - * the tree at a single point in time. For example, if a hole is created
- - * at index 5, then subsequently a hole is created at index 10,
- - * radix_tree_next_hole covering both indexes may return 10 if called
- - * under rcu_read_lock.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +rdx_t radix_tree_next_hole(struct radix_tree_root *root,
- + rdx_t index, rdx_t max_scan)
- +{
- + rdx_t i;
- +#else
- unsigned long radix_tree_next_hole(struct radix_tree_root *root,
- unsigned long index, unsigned long max_scan)
- {
- unsigned long i;
- +#endif
- for (i = 0; i < max_scan; i++) {
- if (!radix_tree_lookup(root, index))
- @@ -947,36 +780,33 @@ unsigned long radix_tree_next_hole(struct radix_tree_root *root,
- }
- EXPORT_SYMBOL(radix_tree_next_hole);
- -/**
- - * radix_tree_prev_hole - find the prev hole (not-present entry)
- - * @root: tree root
- - * @index: index key
- - * @max_scan: maximum range to search
- - *
- - * Search backwards in the range [max(index-max_scan+1, 0), index]
- - * for the first hole.
- - *
- - * Returns: the index of the hole if found, otherwise returns an index
- - * outside of the set specified (in which case 'index - return >= max_scan'
- - * will be true). In rare cases of wrap-around, ULONG_MAX will be returned.
- - *
- - * radix_tree_next_hole may be called under rcu_read_lock. However, like
- - * radix_tree_gang_lookup, this will not atomically search a snapshot of
- - * the tree at a single point in time. For example, if a hole is created
- - * at index 10, then subsequently a hole is created at index 5,
- - * radix_tree_prev_hole covering both indexes may return 5 if called under
- - * rcu_read_lock.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +
- +#else
- +
- +#endif
- +
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +rdx_t radix_tree_prev_hole(struct radix_tree_root *root,
- + rdx_t index, rdx_t max_scan)
- +{
- + rdx_t i;
- +#else
- unsigned long radix_tree_prev_hole(struct radix_tree_root *root,
- unsigned long index, unsigned long max_scan)
- {
- unsigned long i;
- +#endif
- for (i = 0; i < max_scan; i++) {
- if (!radix_tree_lookup(root, index))
- break;
- index--;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + if (index == RDX_TREE_KEY_MAX_VALUE)
- +#else
- if (index == ULONG_MAX)
- +#endif
- break;
- }
- @@ -984,28 +814,13 @@ unsigned long radix_tree_prev_hole(struct radix_tree_root *root,
- }
- EXPORT_SYMBOL(radix_tree_prev_hole);
- -/**
- - * radix_tree_gang_lookup - perform multiple lookup on a radix tree
- - * @root: radix tree root
- - * @results: where the results of the lookup are placed
- - * @first_index: start the lookup from this key
- - * @max_items: place up to this many items at *results
- - *
- - * Performs an index-ascending scan of the tree for present items. Places
- - * them at *@results and returns the number of items which were placed at
- - * *@results.
- - *
- - * The implementation is naive.
- - *
- - * Like radix_tree_lookup, radix_tree_gang_lookup may be called under
- - * rcu_read_lock. In this case, rather than the returned results being
- - * an atomic snapshot of the tree at a single point in time, the semantics
- - * of an RCU protected gang lookup are as though multiple radix_tree_lookups
- - * have been issued in individual locks, and results stored in 'results'.
- - */
- unsigned int
- radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t first_index, unsigned int max_items)
- +#else
- unsigned long first_index, unsigned int max_items)
- +#endif
- {
- struct radix_tree_iter iter;
- void **slot;
- @@ -1030,28 +845,15 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
- }
- EXPORT_SYMBOL(radix_tree_gang_lookup);
- -/**
- - * radix_tree_gang_lookup_slot - perform multiple slot lookup on radix tree
- - * @root: radix tree root
- - * @results: where the results of the lookup are placed
- - * @indices: where their indices should be placed (but usually NULL)
- - * @first_index: start the lookup from this key
- - * @max_items: place up to this many items at *results
- - *
- - * Performs an index-ascending scan of the tree for present items. Places
- - * their slots at *@results and returns the number of items which were
- - * placed at *@results.
- - *
- - * The implementation is naive.
- - *
- - * Like radix_tree_gang_lookup as far as RCU and locking goes. Slots must
- - * be dereferenced with radix_tree_deref_slot, and if using only RCU
- - * protection, radix_tree_deref_slot may fail requiring a retry.
- - */
- unsigned int
- radix_tree_gang_lookup_slot(struct radix_tree_root *root,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + void ***results, rdx_t *indices,
- + rdx_t first_index, unsigned int max_items)
- +#else
- void ***results, unsigned long *indices,
- unsigned long first_index, unsigned int max_items)
- +#endif
- {
- struct radix_tree_iter iter;
- void **slot;
- @@ -1072,22 +874,13 @@ radix_tree_gang_lookup_slot(struct radix_tree_root *root,
- }
- EXPORT_SYMBOL(radix_tree_gang_lookup_slot);
- -/**
- - * radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree
- - * based on a tag
- - * @root: radix tree root
- - * @results: where the results of the lookup are placed
- - * @first_index: start the lookup from this key
- - * @max_items: place up to this many items at *results
- - * @tag: the tag index (< RADIX_TREE_MAX_TAGS)
- - *
- - * Performs an index-ascending scan of the tree for present items which
- - * have the tag indexed by @tag set. Places the items at *@results and
- - * returns the number of items which were placed at *@results.
- - */
- unsigned int
- radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t first_index, unsigned int max_items,
- +#else
- unsigned long first_index, unsigned int max_items,
- +#endif
- unsigned int tag)
- {
- struct radix_tree_iter iter;
- @@ -1113,22 +906,13 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
- }
- EXPORT_SYMBOL(radix_tree_gang_lookup_tag);
- -/**
- - * radix_tree_gang_lookup_tag_slot - perform multiple slot lookup on a
- - * radix tree based on a tag
- - * @root: radix tree root
- - * @results: where the results of the lookup are placed
- - * @first_index: start the lookup from this key
- - * @max_items: place up to this many items at *results
- - * @tag: the tag index (< RADIX_TREE_MAX_TAGS)
- - *
- - * Performs an index-ascending scan of the tree for present items which
- - * have the tag indexed by @tag set. Places the slots at *@results and
- - * returns the number of slots which were placed at *@results.
- - */
- unsigned int
- radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results,
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t first_index, unsigned int max_items,
- +#else
- unsigned long first_index, unsigned int max_items,
- +#endif
- unsigned int tag)
- {
- struct radix_tree_iter iter;
- @@ -1149,16 +933,22 @@ radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results,
- EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot);
- #if defined(CONFIG_SHMEM) && defined(CONFIG_SWAP)
- -#include <linux/sched.h> /* for cond_resched() */
- +#include <linux/sched.h>
- -/*
- - * This linear search is at present only useful to shmem_unuse_inode().
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +static rdx_t __locate(struct radix_tree_node *slot, void *item,
- + rdx_t index, rdx_t *found_index)
- +#else
- static unsigned long __locate(struct radix_tree_node *slot, void *item,
- unsigned long index, unsigned long *found_index)
- +#endif
- {
- unsigned int shift, height;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t i;
- +#else
- unsigned long i;
- +#endif
- height = slot->height;
- shift = (height-1) * RADIX_TREE_MAP_SHIFT;
- @@ -1168,10 +958,15 @@ static unsigned long __locate(struct radix_tree_node *slot, void *item,
- for (;;) {
- if (slot->slots[i] != NULL)
- break;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + index &= ~((RADIX_TREE_1 << shift) - 1);
- + index += RADIX_TREE_1 << shift;
- +#else
- index &= ~((1UL << shift) - 1);
- index += 1UL << shift;
- +#endif
- if (index == 0)
- - goto out; /* 32-bit wraparound */
- + goto out;
- i++;
- if (i == RADIX_TREE_MAP_SIZE)
- goto out;
- @@ -1183,7 +978,6 @@ static unsigned long __locate(struct radix_tree_node *slot, void *item,
- goto out;
- }
- - /* Bottom level: check items */
- for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) {
- if (slot->slots[i] == item) {
- *found_index = index + i;
- @@ -1196,21 +990,22 @@ out:
- return index;
- }
- -/**
- - * radix_tree_locate_item - search through radix tree for item
- - * @root: radix tree root
- - * @item: item to be found
- - *
- - * Returns index where item was found, or -1 if not found.
- - * Caller must hold no lock (since this time-consuming function needs
- - * to be preemptible), and must check afterwards if item is still there.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +rdx_t radix_tree_locate_item(struct radix_tree_root *root, void *item)
- +#else
- unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item)
- +#endif
- {
- struct radix_tree_node *node;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + rdx_t max_index;
- + rdx_t cur_index = 0;
- + rdx_t found_index = -1;
- +#else
- unsigned long max_index;
- unsigned long cur_index = 0;
- unsigned long found_index = -1;
- +#endif
- do {
- rcu_read_lock();
- @@ -1235,19 +1030,19 @@ unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item)
- return found_index;
- }
- #else
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +rdx_t radix_tree_locate_item(struct radix_tree_root *root, void *item)
- +#else
- unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item)
- +#endif
- {
- return -1;
- }
- -#endif /* CONFIG_SHMEM && CONFIG_SWAP */
- +#endif
- -/**
- - * radix_tree_shrink - shrink height of a radix tree to minimal
- - * @root radix tree root
- - */
- static inline void radix_tree_shrink(struct radix_tree_root *root)
- {
- - /* try to shrink tree height */
- +
- while (root->height > 0) {
- struct radix_tree_node *to_free = root->rnode;
- struct radix_tree_node *slot;
- @@ -1305,16 +1071,11 @@ static inline void radix_tree_shrink(struct radix_tree_root *root)
- }
- }
- -/**
- - * radix_tree_delete - delete an item from a radix tree
- - * @root: radix tree root
- - * @index: index key
- - *
- - * Remove the item at @index from the radix tree rooted at @root.
- - *
- - * Returns the address of the deleted item, or NULL if it was not present.
- - */
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +void *radix_tree_delete(struct radix_tree_root *root, rdx_t index)
- +#else
- void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
- +#endif
- {
- struct radix_tree_node *node = NULL;
- struct radix_tree_node *slot = NULL;
- @@ -1349,24 +1110,17 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
- if (slot == NULL)
- goto out;
- - /*
- - * Clear all tags associated with the item to be deleted.
- - * This way of doing it would be inefficient, but seldom is any set.
- - */
- for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) {
- if (tag_get(node, tag, offset))
- radix_tree_tag_clear(root, index, tag);
- }
- to_free = NULL;
- - /* Now free the nodes we do not need anymore */
- +
- while (node) {
- node->slots[offset] = NULL;
- node->count--;
- - /*
- - * Queue the node for deferred freeing after the
- - * last reference to it disappears (set NULL, above).
- - */
- +
- if (to_free)
- radix_tree_node_free(to_free);
- @@ -1376,7 +1130,6 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
- goto out;
- }
- - /* Node with zero slots in use so free it */
- to_free = node;
- index >>= RADIX_TREE_MAP_SHIFT;
- @@ -1395,11 +1148,6 @@ out:
- }
- EXPORT_SYMBOL(radix_tree_delete);
- -/**
- - * radix_tree_tagged - test whether any items in the tree are tagged
- - * @root: radix tree root
- - * @tag: tag to test
- - */
- int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag)
- {
- return root_tag_get(root, tag);
- @@ -1412,16 +1160,28 @@ radix_tree_node_ctor(void *node)
- memset(node, 0, sizeof(struct radix_tree_node));
- }
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- +static __init rdx_t __maxindex(unsigned int height)
- +#else
- static __init unsigned long __maxindex(unsigned int height)
- +#endif
- {
- unsigned int width = height * RADIX_TREE_MAP_SHIFT;
- int shift = RADIX_TREE_INDEX_BITS - width;
- +#if defined(MY_ABC_HERE) || defined(CONFIG_SYNO_HI3536)
- + if (shift < 0)
- + return RDX_TREE_KEY_MAX_VALUE;
- + if (shift >= RADIX_TREE_BITS_PER_KEY)
- + return (rdx_t)0;
- + return RDX_TREE_KEY_MAX_VALUE >> shift;
- +#else
- if (shift < 0)
- return ~0UL;
- if (shift >= BITS_PER_LONG)
- return 0UL;
- return ~0UL >> shift;
- +#endif
- }
- static __init void radix_tree_init_maxindex(void)
- @@ -1439,7 +1199,6 @@ static int radix_tree_callback(struct notifier_block *nfb,
- int cpu = (long)hcpu;
- struct radix_tree_preload *rtp;
- - /* Free per-cpu pool of perloaded nodes */
- if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
- rtp = &per_cpu(radix_tree_preloads, cpu);
- while (rtp->nr) {
- diff --git a/mm/filemap.c b/mm/filemap.c
- index 725a10043244..4018828bf800 100644
- --- a/mm/filemap.c
- +++ b/mm/filemap.c
- @@ -1,14 +1,7 @@
- -/*
- - * linux/mm/filemap.c
- - *
- - * Copyright (C) 1994-1999 Linus Torvalds
- - */
- -
- -/*
- - * This file handles the generic file mmap semantics used by
- - * most "normal" filesystems (but you don't /have/ to use this:
- - * the NFS filesystem used to do this differently, for example)
- - */
- +#ifndef MY_ABC_HERE
- +#define MY_ABC_HERE
- +#endif
- +
- #include <linux/export.h>
- #include <linux/compiler.h>
- #include <linux/fs.h>
- @@ -1550,31 +1087,23 @@ static void do_sync_mmap_readahead(struct vm_area_struct *vma,
- return;
- }
- - /* Avoid banging the cache line if not needed */
- if (ra->mmap_miss < MMAP_LOTSAMISS * 10)
- ra->mmap_miss++;
- - /*
- - * Do we miss much more than hit in this file? If so,
- - * stop bothering with read-ahead. It will only hurt.
- - */
- if (ra->mmap_miss > MMAP_LOTSAMISS)
- return;
- - /*
- - * mmap read-around
- - */
- ra_pages = max_sane_readahead(ra->ra_pages);
- +#ifdef CONFIG_LFS_ON_32CPU
- + ra->start = max_t(long long, 0, offset - ra_pages / 2);
- +#else
- ra->start = max_t(long, 0, offset - ra_pages / 2);
- +#endif
- ra->size = ra_pages;
- ra->async_size = ra_pages / 4;
- ra_submit(ra, mapping, file);
- }
- -/*
- - * Asynchronous readahead happens when we find the page and PG_readahead,
- - * so we want to possibly extend the readahead further..
- - */
- static void do_async_mmap_readahead(struct vm_area_struct *vma,
- struct file_ra_state *ra,
- struct file *file,
Add Comment
Please, Sign In to add comment