[PATCH v2 RFC tip/core/rcu 2/4] rcu: Add rcu_expedite_gp() and rcu_unexpedite_gp() to rcutorture

2015-02-19 Thread Paul E. McKenney
From: "Paul E. McKenney" 

Signed-off-by: Paul E. McKenney 
---
 kernel/rcu/rcutorture.c | 24 
 1 file changed, 24 insertions(+)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 30d42aa55d83..3a60815ce97c 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -853,6 +853,8 @@ rcu_torture_fqs(void *arg)
 static int
 rcu_torture_writer(void *arg)
 {
+   bool can_expedite = !rcu_gp_is_expedited();
+   int expediting = 0;
unsigned long gp_snap;
bool gp_cond1 = gp_cond, gp_exp1 = gp_exp, gp_normal1 = gp_normal;
bool gp_sync1 = gp_sync;
@@ -865,6 +867,12 @@ rcu_torture_writer(void *arg)
int nsynctypes = 0;
 
VERBOSE_TOROUT_STRING("rcu_torture_writer task started");
+   pr_alert("%s" TORTURE_FLAG
+" Grace periods expedited from boot/sysfs for %s,\n",
+torture_type, cur_ops->name);
+   pr_alert("%s" TORTURE_FLAG
+" Testing of dynamic grace-period expediting diabled.\n",
+torture_type);
 
/* Initialize synctype[] array.  If none set, take default. */
if (!gp_cond1 && !gp_exp1 && !gp_normal1 && !gp_sync)
@@ -949,9 +957,25 @@ rcu_torture_writer(void *arg)
}
}
rcutorture_record_progress(++rcu_torture_current_version);
+   /* Cycle through nesting levels of rcu_expedite_gp() calls. */
+   if (can_expedite && torture_random()) {
+   WARN_ON_ONCE(expediting == 0 && rcu_gp_is_expedited());
+   if (expediting >= 0)
+   rcu_expedite_gp();
+   else
+   rcu_unexpedite_gp();
+   if (++expediting > 3)
+   expediting = -expediting;
+   }
rcu_torture_writer_state = RTWS_STUTTER;
stutter_wait("rcu_torture_writer");
} while (!torture_must_stop());
+   /* Reset expediting back to unexpedited. */
+   if (expediting > 0)
+   expediting = -expediting;
+   while (can_expedite && expediting++ < 0)
+   rcu_unexpedite_gp();
+   WARN_ON_ONCE(can_expedite && rcu_gp_is_expedited());
rcu_torture_writer_state = RTWS_STOPPING;
torture_kthread_stopping("rcu_torture_writer");
return 0;
-- 
1.8.1.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 RFC tip/core/rcu 2/4] rcu: Add rcu_expedite_gp() and rcu_unexpedite_gp() to rcutorture

2015-02-19 Thread Paul E. McKenney
From: Paul E. McKenney paul...@linux.vnet.ibm.com

Signed-off-by: Paul E. McKenney paul...@linux.vnet.ibm.com
---
 kernel/rcu/rcutorture.c | 24 
 1 file changed, 24 insertions(+)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 30d42aa55d83..3a60815ce97c 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -853,6 +853,8 @@ rcu_torture_fqs(void *arg)
 static int
 rcu_torture_writer(void *arg)
 {
+   bool can_expedite = !rcu_gp_is_expedited();
+   int expediting = 0;
unsigned long gp_snap;
bool gp_cond1 = gp_cond, gp_exp1 = gp_exp, gp_normal1 = gp_normal;
bool gp_sync1 = gp_sync;
@@ -865,6 +867,12 @@ rcu_torture_writer(void *arg)
int nsynctypes = 0;
 
VERBOSE_TOROUT_STRING(rcu_torture_writer task started);
+   pr_alert(%s TORTURE_FLAG
+ Grace periods expedited from boot/sysfs for %s,\n,
+torture_type, cur_ops-name);
+   pr_alert(%s TORTURE_FLAG
+ Testing of dynamic grace-period expediting diabled.\n,
+torture_type);
 
/* Initialize synctype[] array.  If none set, take default. */
if (!gp_cond1  !gp_exp1  !gp_normal1  !gp_sync)
@@ -949,9 +957,25 @@ rcu_torture_writer(void *arg)
}
}
rcutorture_record_progress(++rcu_torture_current_version);
+   /* Cycle through nesting levels of rcu_expedite_gp() calls. */
+   if (can_expedite  torture_random(rand)) {
+   WARN_ON_ONCE(expediting == 0  rcu_gp_is_expedited());
+   if (expediting = 0)
+   rcu_expedite_gp();
+   else
+   rcu_unexpedite_gp();
+   if (++expediting  3)
+   expediting = -expediting;
+   }
rcu_torture_writer_state = RTWS_STUTTER;
stutter_wait(rcu_torture_writer);
} while (!torture_must_stop());
+   /* Reset expediting back to unexpedited. */
+   if (expediting  0)
+   expediting = -expediting;
+   while (can_expedite  expediting++  0)
+   rcu_unexpedite_gp();
+   WARN_ON_ONCE(can_expedite  rcu_gp_is_expedited());
rcu_torture_writer_state = RTWS_STOPPING;
torture_kthread_stopping(rcu_torture_writer);
return 0;
-- 
1.8.1.5

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/