|
@@ -479,12 +479,31 @@ static int __rcu_pending(struct rcu_ctrlblk *rcp, struct rcu_data *rdp)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Check to see if there is any immediate RCU-related work to be done
|
|
|
+ * by the current CPU, returning 1 if so. This function is part of the
|
|
|
+ * RCU implementation; it is -not- an exported member of the RCU API.
|
|
|
+ */
|
|
|
int rcu_pending(int cpu)
|
|
|
{
|
|
|
return __rcu_pending(&rcu_ctrlblk, &per_cpu(rcu_data, cpu)) ||
|
|
|
__rcu_pending(&rcu_bh_ctrlblk, &per_cpu(rcu_bh_data, cpu));
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Check to see if any future RCU-related work will need to be done
|
|
|
+ * by the current CPU, even if none need be done immediately, returning
|
|
|
+ * 1 if so. This function is part of the RCU implementation; it is -not-
|
|
|
+ * an exported member of the RCU API.
|
|
|
+ */
|
|
|
+int rcu_needs_cpu(int cpu)
|
|
|
+{
|
|
|
+ struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
|
|
|
+ struct rcu_data *rdp_bh = &per_cpu(rcu_bh_data, cpu);
|
|
|
+
|
|
|
+ return (!!rdp->curlist || !!rdp_bh->curlist || rcu_pending(cpu));
|
|
|
+}
|
|
|
+
|
|
|
void rcu_check_callbacks(int cpu, int user)
|
|
|
{
|
|
|
if (user ||
|