rcu: off by one in gp_state_getname()
Subsystems (2)
PATCH 1/1 rcu: off by one in gp_state_getname()
It should be >= ARRAY_SIZE() instead of > ARRAY_SIZE().
kernel/rcu/tree.c +1 -1
@@ -1203,7 +1203,7 @@ static void record_gp_stall_check_time(struct rcu_state *rsp)*/ static char *gp_state_getname (short gs) { -if (gs <0 || gs >ARRAY_SIZE (gp_state_names)) +if (gs <0 || gs >=ARRAY_SIZE (gp_state_names))return "???" ;return gp_state_names[gs]; }
Quoted 4 lines · Dan Carpenter
It should be >=
ARRAY_SIZE()instead of >ARRAY_SIZE().Fixes 6231da675578 ('rcu: Print symbolic name for ->gp_state')Signed-off-by Dan Carpenter <[email protected]>
Good catch! I folded this into the original commit with attribution, please see below.
Thanx, Paul
kernel/rcu/tree.c static void record_gp_stall_check_time(struct rcu_state *rsp) · line 1209
Quoted 13 lines
kernel/rcu/tree.c +1
-1@@ -1203,7 +1203,7 @@ static void record_gp_stall_check_time(struct rcu_state *rsp)*/ static char *gp_state_getname (short gs) { -if (gs <0 || gs >ARRAY_SIZE (gp_state_names)) +if (gs <0 || gs >=ARRAY_SIZE (gp_state_names))return "???" ;return gp_state_names[gs]; }
------------------------------------------------------------------------
commit 31bf937d2dcbe71a329e5bc6c7726f3a5949089a
Author: Paul E. McKenney <[email protected]> Date: Tue Nov 17 14:39:26 2015 -0800
rcu: Print symbolic name for ->gp_state
Currently, ->gp_state is printed as an integer, which slows debugging. This commit therefore prints a symbolic name in addition to the integer.
kernel/rcu/tree.c +13 -2
@@ -1199,6 +1199,16 @@ static void record_gp_stall_check_time(struct rcu_state *rsp) }/* +* Convert a ->gp_state value to a character string. +*/ +static char *gp_state_getname (short gs) +{ +if (gs <0 || gs >=ARRAY_SIZE (gp_state_names)) +return "???" ; +return gp_state_names[gs]; +} + +/* * Complain about starvation of grace-period kthread. */ static void rcu_check_gp_kthread_starvation (struct rcu_state *rsp)
@@ -1209,10 +1219,11 @@ static void rcu_check_gp_kthread_starvation(struct rcu_state *rsp) j = jiffies; gpa =READ_ONCE (rsp->gp_activity);if (j - gpa >2 *HZ ) { -pr_err ("%s kthread starved for %ld jiffies! g%lu c%lu f%#x s%d ->state=%#lx\n" , +pr_err ("%s kthread starved for %ld jiffies! g%lu c%lu f%#x %s(%d) ->state=%#lx\n" , rsp->name, j - gpa, rsp->gpnum, rsp->completed, - rsp->gp_flags, rsp->gp_state, + rsp->gp_flags, +gp_state_getname (rsp->gp_state), rsp->gp_state, rsp->gp_kthread ? rsp->gp_kthread->state : ~0 );if (rsp->gp_kthread)sched_show_task (rsp->gp_kthread);
kernel/rcu/tree.h +9 -0
@@ -546,6 +546,15 @@ struct rcu_state {#define RCU_GP_DOING_FQS 4/* Wait done for force-quiescent-state time. */ #define RCU_GP_CLEANUP 5/* Grace-period cleanup started. */ #define RCU_GP_CLEANED 6/* Grace-period cleanup complete. */ +static char *const gp_state_names[] = { +"RCU_GP_IDLE" , +"RCU_GP_WAIT_GPS" , +"RCU_GP_DONE_GPS" , +"RCU_GP_WAIT_FQS" , +"RCU_GP_DOING_FQS" , +"RCU_GP_CLEANUP" , +"RCU_GP_CLEANED" , +};extern struct list_head rcu_struct_flavors;
Heh. It's just "Dan" though, it's not short for anything.
regards,
dan carpenter
Quoted 1 line · Dan Carpenter
Heh. It's just "Dan" though, it's not short for anything.
Apologies, fixed!
Thanx, Paul