mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 14:41:27 +00:00
Merge branches 'doc.2014.02.24a', 'fixes.2014.02.26a' and 'rt.2014.02.17b' into HEAD
doc.2014.02.24a: Documentation changes fixes.2014.02.26a: Miscellaneous fixes rt.2014.02.17b: Response-time-related changes
This commit is contained in:
commit
322efba5b6
18 changed files with 114 additions and 113 deletions
|
@ -497,7 +497,7 @@ repeat:
|
||||||
error = fd;
|
error = fd;
|
||||||
#if 1
|
#if 1
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if (rcu_dereference_raw(fdt->fd[fd]) != NULL) {
|
if (rcu_access_pointer(fdt->fd[fd]) != NULL) {
|
||||||
printk(KERN_WARNING "alloc_fd: slot %d not NULL!\n", fd);
|
printk(KERN_WARNING "alloc_fd: slot %d not NULL!\n", fd);
|
||||||
rcu_assign_pointer(fdt->fd[fd], NULL);
|
rcu_assign_pointer(fdt->fd[fd], NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,9 +247,10 @@ static inline void list_splice_init_rcu(struct list_head *list,
|
||||||
* primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
|
* primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
|
||||||
*/
|
*/
|
||||||
#define list_entry_rcu(ptr, type, member) \
|
#define list_entry_rcu(ptr, type, member) \
|
||||||
({typeof (*ptr) __rcu *__ptr = (typeof (*ptr) __rcu __force *)ptr; \
|
({ \
|
||||||
container_of((typeof(ptr))rcu_dereference_raw(__ptr), type, member); \
|
typeof(*ptr) __rcu *__ptr = (typeof(*ptr) __rcu __force *)ptr; \
|
||||||
})
|
container_of((typeof(ptr))rcu_dereference_raw(__ptr), type, member); \
|
||||||
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Where are list_empty_rcu() and list_first_entry_rcu()?
|
* Where are list_empty_rcu() and list_first_entry_rcu()?
|
||||||
|
@ -285,11 +286,11 @@ static inline void list_splice_init_rcu(struct list_head *list,
|
||||||
* primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
|
* primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
|
||||||
*/
|
*/
|
||||||
#define list_first_or_null_rcu(ptr, type, member) \
|
#define list_first_or_null_rcu(ptr, type, member) \
|
||||||
({struct list_head *__ptr = (ptr); \
|
({ \
|
||||||
struct list_head *__next = ACCESS_ONCE(__ptr->next); \
|
struct list_head *__ptr = (ptr); \
|
||||||
likely(__ptr != __next) ? \
|
struct list_head *__next = ACCESS_ONCE(__ptr->next); \
|
||||||
list_entry_rcu(__next, type, member) : NULL; \
|
likely(__ptr != __next) ? list_entry_rcu(__next, type, member) : NULL; \
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* list_for_each_entry_rcu - iterate over rcu list of given type
|
* list_for_each_entry_rcu - iterate over rcu list of given type
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2001
|
* Copyright IBM Corporation, 2001
|
||||||
*
|
*
|
||||||
|
@ -44,7 +44,9 @@
|
||||||
#include <linux/debugobjects.h>
|
#include <linux/debugobjects.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
#include <asm/barrier.h>
|
||||||
|
|
||||||
|
extern int rcu_expedited; /* for sysctl */
|
||||||
#ifdef CONFIG_RCU_TORTURE_TEST
|
#ifdef CONFIG_RCU_TORTURE_TEST
|
||||||
extern int rcutorture_runnable; /* for sysctl */
|
extern int rcutorture_runnable; /* for sysctl */
|
||||||
#endif /* #ifdef CONFIG_RCU_TORTURE_TEST */
|
#endif /* #ifdef CONFIG_RCU_TORTURE_TEST */
|
||||||
|
@ -479,11 +481,9 @@ static inline void rcu_preempt_sleep_check(void)
|
||||||
do { \
|
do { \
|
||||||
rcu_preempt_sleep_check(); \
|
rcu_preempt_sleep_check(); \
|
||||||
rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map), \
|
rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map), \
|
||||||
"Illegal context switch in RCU-bh" \
|
"Illegal context switch in RCU-bh read-side critical section"); \
|
||||||
" read-side critical section"); \
|
|
||||||
rcu_lockdep_assert(!lock_is_held(&rcu_sched_lock_map), \
|
rcu_lockdep_assert(!lock_is_held(&rcu_sched_lock_map), \
|
||||||
"Illegal context switch in RCU-sched"\
|
"Illegal context switch in RCU-sched read-side critical section"); \
|
||||||
" read-side critical section"); \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#else /* #ifdef CONFIG_PROVE_RCU */
|
#else /* #ifdef CONFIG_PROVE_RCU */
|
||||||
|
@ -510,43 +510,40 @@ static inline void rcu_preempt_sleep_check(void)
|
||||||
#endif /* #else #ifdef __CHECKER__ */
|
#endif /* #else #ifdef __CHECKER__ */
|
||||||
|
|
||||||
#define __rcu_access_pointer(p, space) \
|
#define __rcu_access_pointer(p, space) \
|
||||||
({ \
|
({ \
|
||||||
typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \
|
typeof(*p) *_________p1 = (typeof(*p) *__force)ACCESS_ONCE(p); \
|
||||||
rcu_dereference_sparse(p, space); \
|
rcu_dereference_sparse(p, space); \
|
||||||
((typeof(*p) __force __kernel *)(_________p1)); \
|
((typeof(*p) __force __kernel *)(_________p1)); \
|
||||||
})
|
})
|
||||||
#define __rcu_dereference_check(p, c, space) \
|
#define __rcu_dereference_check(p, c, space) \
|
||||||
({ \
|
({ \
|
||||||
typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \
|
typeof(*p) *_________p1 = (typeof(*p) *__force)ACCESS_ONCE(p); \
|
||||||
rcu_lockdep_assert(c, "suspicious rcu_dereference_check()" \
|
rcu_lockdep_assert(c, "suspicious rcu_dereference_check() usage"); \
|
||||||
" usage"); \
|
rcu_dereference_sparse(p, space); \
|
||||||
rcu_dereference_sparse(p, space); \
|
smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
|
||||||
smp_read_barrier_depends(); \
|
((typeof(*p) __force __kernel *)(_________p1)); \
|
||||||
((typeof(*p) __force __kernel *)(_________p1)); \
|
})
|
||||||
})
|
|
||||||
#define __rcu_dereference_protected(p, c, space) \
|
#define __rcu_dereference_protected(p, c, space) \
|
||||||
({ \
|
({ \
|
||||||
rcu_lockdep_assert(c, "suspicious rcu_dereference_protected()" \
|
rcu_lockdep_assert(c, "suspicious rcu_dereference_protected() usage"); \
|
||||||
" usage"); \
|
rcu_dereference_sparse(p, space); \
|
||||||
rcu_dereference_sparse(p, space); \
|
((typeof(*p) __force __kernel *)(p)); \
|
||||||
((typeof(*p) __force __kernel *)(p)); \
|
})
|
||||||
})
|
|
||||||
|
|
||||||
#define __rcu_access_index(p, space) \
|
#define __rcu_access_index(p, space) \
|
||||||
({ \
|
({ \
|
||||||
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
||||||
rcu_dereference_sparse(p, space); \
|
rcu_dereference_sparse(p, space); \
|
||||||
(_________p1); \
|
(_________p1); \
|
||||||
})
|
})
|
||||||
#define __rcu_dereference_index_check(p, c) \
|
#define __rcu_dereference_index_check(p, c) \
|
||||||
({ \
|
({ \
|
||||||
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
||||||
rcu_lockdep_assert(c, \
|
rcu_lockdep_assert(c, \
|
||||||
"suspicious rcu_dereference_index_check()" \
|
"suspicious rcu_dereference_index_check() usage"); \
|
||||||
" usage"); \
|
smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
|
||||||
smp_read_barrier_depends(); \
|
(_________p1); \
|
||||||
(_________p1); \
|
})
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RCU_INITIALIZER() - statically initialize an RCU-protected global variable
|
* RCU_INITIALIZER() - statically initialize an RCU-protected global variable
|
||||||
|
@ -585,12 +582,7 @@ static inline void rcu_preempt_sleep_check(void)
|
||||||
* please be careful when making changes to rcu_assign_pointer() and the
|
* please be careful when making changes to rcu_assign_pointer() and the
|
||||||
* other macros that it invokes.
|
* other macros that it invokes.
|
||||||
*/
|
*/
|
||||||
#define rcu_assign_pointer(p, v) \
|
#define rcu_assign_pointer(p, v) smp_store_release(&p, RCU_INITIALIZER(v))
|
||||||
do { \
|
|
||||||
smp_wmb(); \
|
|
||||||
ACCESS_ONCE(p) = RCU_INITIALIZER(v); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rcu_access_pointer() - fetch RCU pointer with no dereferencing
|
* rcu_access_pointer() - fetch RCU pointer with no dereferencing
|
||||||
|
@ -1015,11 +1007,21 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)
|
||||||
#define kfree_rcu(ptr, rcu_head) \
|
#define kfree_rcu(ptr, rcu_head) \
|
||||||
__kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head))
|
__kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head))
|
||||||
|
|
||||||
#ifdef CONFIG_RCU_NOCB_CPU
|
#if defined(CONFIG_TINY_RCU) || defined(CONFIG_RCU_NOCB_CPU_ALL)
|
||||||
|
static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies)
|
||||||
|
{
|
||||||
|
*delta_jiffies = ULONG_MAX;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* #if defined(CONFIG_TINY_RCU) || defined(CONFIG_RCU_NOCB_CPU_ALL) */
|
||||||
|
|
||||||
|
#if defined(CONFIG_RCU_NOCB_CPU_ALL)
|
||||||
|
static inline bool rcu_is_nocb_cpu(int cpu) { return true; }
|
||||||
|
#elif defined(CONFIG_RCU_NOCB_CPU)
|
||||||
bool rcu_is_nocb_cpu(int cpu);
|
bool rcu_is_nocb_cpu(int cpu);
|
||||||
#else
|
#else
|
||||||
static inline bool rcu_is_nocb_cpu(int cpu) { return false; }
|
static inline bool rcu_is_nocb_cpu(int cpu) { return false; }
|
||||||
#endif /* #else #ifdef CONFIG_RCU_NOCB_CPU */
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Only for use by adaptive-ticks code. */
|
/* Only for use by adaptive-ticks code. */
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2008
|
* Copyright IBM Corporation, 2008
|
||||||
*
|
*
|
||||||
|
@ -68,12 +68,6 @@ static inline void kfree_call_rcu(struct rcu_head *head,
|
||||||
call_rcu(head, func);
|
call_rcu(head, func);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies)
|
|
||||||
{
|
|
||||||
*delta_jiffies = ULONG_MAX;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void rcu_note_context_switch(int cpu)
|
static inline void rcu_note_context_switch(int cpu)
|
||||||
{
|
{
|
||||||
rcu_sched_qs(cpu);
|
rcu_sched_qs(cpu);
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2008
|
* Copyright IBM Corporation, 2008
|
||||||
*
|
*
|
||||||
|
@ -31,7 +31,9 @@
|
||||||
#define __LINUX_RCUTREE_H
|
#define __LINUX_RCUTREE_H
|
||||||
|
|
||||||
void rcu_note_context_switch(int cpu);
|
void rcu_note_context_switch(int cpu);
|
||||||
|
#ifndef CONFIG_RCU_NOCB_CPU_ALL
|
||||||
int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies);
|
int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies);
|
||||||
|
#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
|
||||||
void rcu_cpu_stall_reset(void);
|
void rcu_cpu_stall_reset(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright (C) IBM Corporation, 2006
|
* Copyright (C) IBM Corporation, 2006
|
||||||
* Copyright (C) Fujitsu, 2012
|
* Copyright (C) Fujitsu, 2012
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/capability.h>
|
#include <linux/capability.h>
|
||||||
|
|
||||||
|
#include <linux/rcupdate.h> /* rcu_expedited */
|
||||||
|
|
||||||
#define KERNEL_ATTR_RO(_name) \
|
#define KERNEL_ATTR_RO(_name) \
|
||||||
static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
|
static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
|
||||||
|
|
||||||
|
|
|
@ -309,7 +309,7 @@ int __blocking_notifier_call_chain(struct blocking_notifier_head *nh,
|
||||||
* racy then it does not matter what the result of the test
|
* racy then it does not matter what the result of the test
|
||||||
* is, we re-check the list after having taken the lock anyway:
|
* is, we re-check the list after having taken the lock anyway:
|
||||||
*/
|
*/
|
||||||
if (rcu_dereference_raw(nh->head)) {
|
if (rcu_access_pointer(nh->head)) {
|
||||||
down_read(&nh->rwsem);
|
down_read(&nh->rwsem);
|
||||||
ret = notifier_call_chain(&nh->head, val, v, nr_to_call,
|
ret = notifier_call_chain(&nh->head, val, v, nr_to_call,
|
||||||
nr_calls);
|
nr_calls);
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2011
|
* Copyright IBM Corporation, 2011
|
||||||
*
|
*
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
#ifndef __LINUX_RCU_H
|
#ifndef __LINUX_RCU_H
|
||||||
#define __LINUX_RCU_H
|
#define __LINUX_RCU_H
|
||||||
|
|
||||||
|
#include <trace/events/rcu.h>
|
||||||
#ifdef CONFIG_RCU_TRACE
|
#ifdef CONFIG_RCU_TRACE
|
||||||
#define RCU_TRACE(stmt) stmt
|
#define RCU_TRACE(stmt) stmt
|
||||||
#else /* #ifdef CONFIG_RCU_TRACE */
|
#else /* #ifdef CONFIG_RCU_TRACE */
|
||||||
|
@ -116,8 +117,6 @@ static inline bool __rcu_reclaim(const char *rn, struct rcu_head *head)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int rcu_expedited;
|
|
||||||
|
|
||||||
#ifdef CONFIG_RCU_STALL_COMMON
|
#ifdef CONFIG_RCU_STALL_COMMON
|
||||||
|
|
||||||
extern int rcu_cpu_stall_suppress;
|
extern int rcu_cpu_stall_suppress;
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright (C) IBM Corporation, 2006
|
* Copyright (C) IBM Corporation, 2006
|
||||||
* Copyright (C) Fujitsu, 2012
|
* Copyright (C) Fujitsu, 2012
|
||||||
|
@ -36,8 +36,6 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/srcu.h>
|
#include <linux/srcu.h>
|
||||||
|
|
||||||
#include <trace/events/rcu.h>
|
|
||||||
|
|
||||||
#include "rcu.h"
|
#include "rcu.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -398,7 +396,7 @@ void call_srcu(struct srcu_struct *sp, struct rcu_head *head,
|
||||||
rcu_batch_queue(&sp->batch_queue, head);
|
rcu_batch_queue(&sp->batch_queue, head);
|
||||||
if (!sp->running) {
|
if (!sp->running) {
|
||||||
sp->running = true;
|
sp->running = true;
|
||||||
schedule_delayed_work(&sp->work, 0);
|
queue_delayed_work(system_power_efficient_wq, &sp->work, 0);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&sp->queue_lock, flags);
|
spin_unlock_irqrestore(&sp->queue_lock, flags);
|
||||||
}
|
}
|
||||||
|
@ -674,7 +672,8 @@ static void srcu_reschedule(struct srcu_struct *sp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pending)
|
if (pending)
|
||||||
schedule_delayed_work(&sp->work, SRCU_INTERVAL);
|
queue_delayed_work(system_power_efficient_wq,
|
||||||
|
&sp->work, SRCU_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2008
|
* Copyright IBM Corporation, 2008
|
||||||
*
|
*
|
||||||
|
@ -37,10 +37,6 @@
|
||||||
#include <linux/prefetch.h>
|
#include <linux/prefetch.h>
|
||||||
#include <linux/ftrace_event.h>
|
#include <linux/ftrace_event.h>
|
||||||
|
|
||||||
#ifdef CONFIG_RCU_TRACE
|
|
||||||
#include <trace/events/rcu.h>
|
|
||||||
#endif /* #else #ifdef CONFIG_RCU_TRACE */
|
|
||||||
|
|
||||||
#include "rcu.h"
|
#include "rcu.h"
|
||||||
|
|
||||||
/* Forward declarations for tiny_plugin.h. */
|
/* Forward declarations for tiny_plugin.h. */
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010 Linaro
|
* Copyright (c) 2010 Linaro
|
||||||
*
|
*
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright (C) IBM Corporation, 2005, 2006
|
* Copyright (C) IBM Corporation, 2005, 2006
|
||||||
*
|
*
|
||||||
|
@ -1352,7 +1352,7 @@ rcu_torture_shutdown(void *arg)
|
||||||
unsigned long jiffies_snap;
|
unsigned long jiffies_snap;
|
||||||
|
|
||||||
VERBOSE_PRINTK_STRING("rcu_torture_shutdown task started");
|
VERBOSE_PRINTK_STRING("rcu_torture_shutdown task started");
|
||||||
jiffies_snap = ACCESS_ONCE(jiffies);
|
jiffies_snap = jiffies;
|
||||||
while (ULONG_CMP_LT(jiffies_snap, shutdown_time) &&
|
while (ULONG_CMP_LT(jiffies_snap, shutdown_time) &&
|
||||||
!kthread_should_stop()) {
|
!kthread_should_stop()) {
|
||||||
delta = shutdown_time - jiffies_snap;
|
delta = shutdown_time - jiffies_snap;
|
||||||
|
@ -1361,7 +1361,7 @@ rcu_torture_shutdown(void *arg)
|
||||||
"rcu_torture_shutdown task: %lu jiffies remaining\n",
|
"rcu_torture_shutdown task: %lu jiffies remaining\n",
|
||||||
torture_type, delta);
|
torture_type, delta);
|
||||||
schedule_timeout_interruptible(delta);
|
schedule_timeout_interruptible(delta);
|
||||||
jiffies_snap = ACCESS_ONCE(jiffies);
|
jiffies_snap = jiffies;
|
||||||
}
|
}
|
||||||
if (kthread_should_stop()) {
|
if (kthread_should_stop()) {
|
||||||
VERBOSE_PRINTK_STRING("rcu_torture_shutdown task stopping");
|
VERBOSE_PRINTK_STRING("rcu_torture_shutdown task stopping");
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2008
|
* Copyright IBM Corporation, 2008
|
||||||
*
|
*
|
||||||
|
@ -58,8 +58,6 @@
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
|
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include <trace/events/rcu.h>
|
|
||||||
|
|
||||||
#include "rcu.h"
|
#include "rcu.h"
|
||||||
|
|
||||||
MODULE_ALIAS("rcutree");
|
MODULE_ALIAS("rcutree");
|
||||||
|
@ -837,7 +835,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp,
|
||||||
* to the next. Only do this for the primary flavor of RCU.
|
* to the next. Only do this for the primary flavor of RCU.
|
||||||
*/
|
*/
|
||||||
if (rdp->rsp == rcu_state &&
|
if (rdp->rsp == rcu_state &&
|
||||||
ULONG_CMP_GE(ACCESS_ONCE(jiffies), rdp->rsp->jiffies_resched)) {
|
ULONG_CMP_GE(jiffies, rdp->rsp->jiffies_resched)) {
|
||||||
rdp->rsp->jiffies_resched += 5;
|
rdp->rsp->jiffies_resched += 5;
|
||||||
resched_cpu(rdp->cpu);
|
resched_cpu(rdp->cpu);
|
||||||
}
|
}
|
||||||
|
@ -847,7 +845,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp,
|
||||||
|
|
||||||
static void record_gp_stall_check_time(struct rcu_state *rsp)
|
static void record_gp_stall_check_time(struct rcu_state *rsp)
|
||||||
{
|
{
|
||||||
unsigned long j = ACCESS_ONCE(jiffies);
|
unsigned long j = jiffies;
|
||||||
unsigned long j1;
|
unsigned long j1;
|
||||||
|
|
||||||
rsp->gp_start = j;
|
rsp->gp_start = j;
|
||||||
|
@ -1005,7 +1003,7 @@ static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp)
|
||||||
|
|
||||||
if (rcu_cpu_stall_suppress || !rcu_gp_in_progress(rsp))
|
if (rcu_cpu_stall_suppress || !rcu_gp_in_progress(rsp))
|
||||||
return;
|
return;
|
||||||
j = ACCESS_ONCE(jiffies);
|
j = jiffies;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lots of memory barriers to reject false positives.
|
* Lots of memory barriers to reject false positives.
|
||||||
|
@ -2304,7 +2302,7 @@ static void force_quiescent_state(struct rcu_state *rsp)
|
||||||
if (rnp_old != NULL)
|
if (rnp_old != NULL)
|
||||||
raw_spin_unlock(&rnp_old->fqslock);
|
raw_spin_unlock(&rnp_old->fqslock);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rsp->n_force_qs_lh++;
|
ACCESS_ONCE(rsp->n_force_qs_lh)++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rnp_old = rnp;
|
rnp_old = rnp;
|
||||||
|
@ -2316,7 +2314,7 @@ static void force_quiescent_state(struct rcu_state *rsp)
|
||||||
smp_mb__after_unlock_lock();
|
smp_mb__after_unlock_lock();
|
||||||
raw_spin_unlock(&rnp_old->fqslock);
|
raw_spin_unlock(&rnp_old->fqslock);
|
||||||
if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
|
if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
|
||||||
rsp->n_force_qs_lh++;
|
ACCESS_ONCE(rsp->n_force_qs_lh)++;
|
||||||
raw_spin_unlock_irqrestore(&rnp_old->lock, flags);
|
raw_spin_unlock_irqrestore(&rnp_old->lock, flags);
|
||||||
return; /* Someone beat us to it. */
|
return; /* Someone beat us to it. */
|
||||||
}
|
}
|
||||||
|
@ -2880,7 +2878,7 @@ static int rcu_pending(int cpu)
|
||||||
* non-NULL, store an indication of whether all callbacks are lazy.
|
* non-NULL, store an indication of whether all callbacks are lazy.
|
||||||
* (If there are no callbacks, all of them are deemed to be lazy.)
|
* (If there are no callbacks, all of them are deemed to be lazy.)
|
||||||
*/
|
*/
|
||||||
static int rcu_cpu_has_callbacks(int cpu, bool *all_lazy)
|
static int __maybe_unused rcu_cpu_has_callbacks(int cpu, bool *all_lazy)
|
||||||
{
|
{
|
||||||
bool al = true;
|
bool al = true;
|
||||||
bool hc = false;
|
bool hc = false;
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2008
|
* Copyright IBM Corporation, 2008
|
||||||
*
|
*
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright Red Hat, 2009
|
* Copyright Red Hat, 2009
|
||||||
* Copyright IBM Corporation, 2009
|
* Copyright IBM Corporation, 2009
|
||||||
|
@ -1586,11 +1586,13 @@ static void rcu_prepare_kthreads(int cpu)
|
||||||
* Because we not have RCU_FAST_NO_HZ, just check whether this CPU needs
|
* Because we not have RCU_FAST_NO_HZ, just check whether this CPU needs
|
||||||
* any flavor of RCU.
|
* any flavor of RCU.
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_RCU_NOCB_CPU_ALL
|
||||||
int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies)
|
int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies)
|
||||||
{
|
{
|
||||||
*delta_jiffies = ULONG_MAX;
|
*delta_jiffies = ULONG_MAX;
|
||||||
return rcu_cpu_has_callbacks(cpu, NULL);
|
return rcu_cpu_has_callbacks(cpu, NULL);
|
||||||
}
|
}
|
||||||
|
#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up
|
* Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up
|
||||||
|
@ -1656,7 +1658,7 @@ extern int tick_nohz_active;
|
||||||
* only if it has been awhile since the last time we did so. Afterwards,
|
* only if it has been awhile since the last time we did so. Afterwards,
|
||||||
* if there are any callbacks ready for immediate invocation, return true.
|
* if there are any callbacks ready for immediate invocation, return true.
|
||||||
*/
|
*/
|
||||||
static bool rcu_try_advance_all_cbs(void)
|
static bool __maybe_unused rcu_try_advance_all_cbs(void)
|
||||||
{
|
{
|
||||||
bool cbs_ready = false;
|
bool cbs_ready = false;
|
||||||
struct rcu_data *rdp;
|
struct rcu_data *rdp;
|
||||||
|
@ -1696,6 +1698,7 @@ static bool rcu_try_advance_all_cbs(void)
|
||||||
*
|
*
|
||||||
* The caller must have disabled interrupts.
|
* The caller must have disabled interrupts.
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_RCU_NOCB_CPU_ALL
|
||||||
int rcu_needs_cpu(int cpu, unsigned long *dj)
|
int rcu_needs_cpu(int cpu, unsigned long *dj)
|
||||||
{
|
{
|
||||||
struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
|
struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
|
||||||
|
@ -1726,6 +1729,7 @@ int rcu_needs_cpu(int cpu, unsigned long *dj)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prepare a CPU for idle from an RCU perspective. The first major task
|
* Prepare a CPU for idle from an RCU perspective. The first major task
|
||||||
|
@ -1739,6 +1743,7 @@ int rcu_needs_cpu(int cpu, unsigned long *dj)
|
||||||
*/
|
*/
|
||||||
static void rcu_prepare_for_idle(int cpu)
|
static void rcu_prepare_for_idle(int cpu)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_RCU_NOCB_CPU_ALL
|
||||||
struct rcu_data *rdp;
|
struct rcu_data *rdp;
|
||||||
struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
|
struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
|
||||||
struct rcu_node *rnp;
|
struct rcu_node *rnp;
|
||||||
|
@ -1790,6 +1795,7 @@ static void rcu_prepare_for_idle(int cpu)
|
||||||
rcu_accelerate_cbs(rsp, rnp, rdp);
|
rcu_accelerate_cbs(rsp, rnp, rdp);
|
||||||
raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */
|
raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */
|
||||||
}
|
}
|
||||||
|
#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1799,11 +1805,12 @@ static void rcu_prepare_for_idle(int cpu)
|
||||||
*/
|
*/
|
||||||
static void rcu_cleanup_after_idle(int cpu)
|
static void rcu_cleanup_after_idle(int cpu)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_RCU_NOCB_CPU_ALL
|
||||||
if (rcu_is_nocb_cpu(cpu))
|
if (rcu_is_nocb_cpu(cpu))
|
||||||
return;
|
return;
|
||||||
if (rcu_try_advance_all_cbs())
|
if (rcu_try_advance_all_cbs())
|
||||||
invoke_rcu_core();
|
invoke_rcu_core();
|
||||||
|
#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2101,6 +2108,7 @@ static void rcu_init_one_nocb(struct rcu_node *rnp)
|
||||||
init_waitqueue_head(&rnp->nocb_gp_wq[1]);
|
init_waitqueue_head(&rnp->nocb_gp_wq[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_RCU_NOCB_CPU_ALL
|
||||||
/* Is the specified CPU a no-CPUs CPU? */
|
/* Is the specified CPU a no-CPUs CPU? */
|
||||||
bool rcu_is_nocb_cpu(int cpu)
|
bool rcu_is_nocb_cpu(int cpu)
|
||||||
{
|
{
|
||||||
|
@ -2108,6 +2116,7 @@ bool rcu_is_nocb_cpu(int cpu)
|
||||||
return cpumask_test_cpu(cpu, rcu_nocb_mask);
|
return cpumask_test_cpu(cpu, rcu_nocb_mask);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enqueue the specified string of rcu_head structures onto the specified
|
* Enqueue the specified string of rcu_head structures onto the specified
|
||||||
|
@ -2893,7 +2902,7 @@ static void rcu_sysidle_init_percpu_data(struct rcu_dynticks *rdtp)
|
||||||
* CPU unless the grace period has extended for too long.
|
* CPU unless the grace period has extended for too long.
|
||||||
*
|
*
|
||||||
* This code relies on the fact that all NO_HZ_FULL CPUs are also
|
* This code relies on the fact that all NO_HZ_FULL CPUs are also
|
||||||
* CONFIG_RCU_NOCB_CPUs.
|
* CONFIG_RCU_NOCB_CPU CPUs.
|
||||||
*/
|
*/
|
||||||
static bool rcu_nohz_full_cpu(struct rcu_state *rsp)
|
static bool rcu_nohz_full_cpu(struct rcu_state *rsp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2008
|
* Copyright IBM Corporation, 2008
|
||||||
*
|
*
|
||||||
|
@ -273,7 +273,7 @@ static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp)
|
||||||
seq_printf(m, "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld/%ld\n",
|
seq_printf(m, "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld/%ld\n",
|
||||||
rsp->n_force_qs, rsp->n_force_qs_ngp,
|
rsp->n_force_qs, rsp->n_force_qs_ngp,
|
||||||
rsp->n_force_qs - rsp->n_force_qs_ngp,
|
rsp->n_force_qs - rsp->n_force_qs_ngp,
|
||||||
rsp->n_force_qs_lh, rsp->qlen_lazy, rsp->qlen);
|
ACCESS_ONCE(rsp->n_force_qs_lh), rsp->qlen_lazy, rsp->qlen);
|
||||||
for (rnp = &rsp->node[0]; rnp - &rsp->node[0] < rcu_num_nodes; rnp++) {
|
for (rnp = &rsp->node[0]; rnp - &rsp->node[0] < rcu_num_nodes; rnp++) {
|
||||||
if (rnp->level != level) {
|
if (rnp->level != level) {
|
||||||
seq_puts(m, "\n");
|
seq_puts(m, "\n");
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, you can access it online at
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* http://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corporation, 2001
|
* Copyright IBM Corporation, 2001
|
||||||
*
|
*
|
||||||
|
@ -49,7 +49,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/rcu.h>
|
|
||||||
|
|
||||||
#include "rcu.h"
|
#include "rcu.h"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue