All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: SeongJae Park <sj38.park@gmail.com>
Cc: akiyks@gmail.com, perfbook@vger.kernel.org
Subject: Re: [PATCH v3 01/17] formal: Rearrange promela sample code location
Date: Tue, 27 Sep 2016 16:19:04 -0700	[thread overview]
Message-ID: <20160927231904.GA11932@linux.vnet.ibm.com> (raw)
In-Reply-To: <20160927215641.7330-1-sj38.park@gmail.com>

On Wed, Sep 28, 2016 at 06:56:25AM +0900, SeongJae Park wrote:
> `Formal Verification` was a section in analysis chapter in initial
> version.  After that, it changed to an appendix[1], then promoted to a
> chapter[2] now while the analysis chapter has merged into debugging
> chapter[3].  However, code samples for formal verification exist under
> `CodeSamples/appendix/formal/` and `CodeSamples/analysis/` directory.
> It is unnecessary duplicate and ambiguous directory hierarchy.  This
> commit removes the unnecessarily dulicated files and changes the name of
> the directory.
> 
> [1] commit 8a7e0cb902e9, ("Move the formal-verification sections to a
>     new appendix.")
> [2] commit 87a645d2aa0b ("Promote formal-methods appendix to a
>     chapter.")
> [3] commit e0c08f843331 ("Merge the analysis chapter into debugging.")
> 
> Signed-off-by: SeongJae Park <sj38.park@gmail.com>

Applied, thank you!

							Thanx, Paul

> ---
>  CodeSamples/appendix/formal/dyntickRCU-base-s.spin | 196 --------
>  .../appendix/formal/dyntickRCU-base-sl-busted.spin | 224 ---------
>  .../appendix/formal/dyntickRCU-base-sl.spin        | 220 ---------
>  CodeSamples/appendix/formal/dyntickRCU-base.spin   | 164 -------
>  .../appendix/formal/dyntickRCU-irq-nmi-ssl.spin    | 506 ---------------------
>  .../appendix/formal/dyntickRCU-irq-ssl.spin        | 356 ---------------
>  .../appendix/formal/dyntickRCU-irqnn-ssl.spin      | 330 --------------
>  CodeSamples/appendix/formal/dyntickRCUtarball.sh   |  18 -
>  CodeSamples/appendix/formal/runspin.sh             |  31 --
>  .../{analysis => formal}/promela/.gitignore        |   0
>  .../promela/atomicincrement.spin                   |   0
>  .../formal => formal/promela/dyntick}/.gitignore   |   0
>  .../promela/dyntick/dyntickRCU-base-s.spin         |   0
>  .../promela/dyntick/dyntickRCU-base-sl-busted.spin |   0
>  .../dyntickRCU-base-sl-busted.spin.trail.txt       |   0
>  .../promela/dyntick/dyntickRCU-base-sl.spin        |   0
>  .../promela/dyntick/dyntickRCU-base.spin           |   0
>  .../promela/dyntick/dyntickRCU-irq-nmi-ssl.spin    |   0
>  .../promela/dyntick/dyntickRCU-irq-ssl.spin        |   0
>  .../promela/dyntick/dyntickRCU-irqnn-ssl.spin      |   0
>  .../promela/dyntick/dyntickRCUtarball.sh           |   0
>  .../promela/dyntick/runspin.sh                     |   0
>  .../{analysis => formal}/promela/increment.spin    |   0
>  CodeSamples/{analysis => formal}/promela/lock.h    |   0
>  CodeSamples/{analysis => formal}/promela/lock.spin |   0
>  CodeSamples/{analysis => formal}/promela/qrcu.spin |   0
>  26 files changed, 2045 deletions(-)
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-base-s.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-base-sl-busted.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-base-sl.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-base.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-irq-nmi-ssl.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-irq-ssl.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCU-irqnn-ssl.spin
>  delete mode 100644 CodeSamples/appendix/formal/dyntickRCUtarball.sh
>  delete mode 100644 CodeSamples/appendix/formal/runspin.sh
>  rename CodeSamples/{analysis => formal}/promela/.gitignore (100%)
>  rename CodeSamples/{analysis => formal}/promela/atomicincrement.spin (100%)
>  rename CodeSamples/{appendix/formal => formal/promela/dyntick}/.gitignore (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-base-s.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-base-sl-busted.spin (100%)
>  rename CodeSamples/{appendix/formal => formal/promela/dyntick}/dyntickRCU-base-sl-busted.spin.trail.txt (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-base-sl.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-base.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-irq-nmi-ssl.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-irq-ssl.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCU-irqnn-ssl.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/dyntickRCUtarball.sh (100%)
>  rename CodeSamples/{analysis => formal}/promela/dyntick/runspin.sh (100%)
>  rename CodeSamples/{analysis => formal}/promela/increment.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/lock.h (100%)
>  rename CodeSamples/{analysis => formal}/promela/lock.spin (100%)
>  rename CodeSamples/{analysis => formal}/promela/qrcu.spin (100%)
> 
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-base-s.spin b/CodeSamples/appendix/formal/dyntickRCU-base-s.spin
> deleted file mode 100644
> index 21aea11..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-base-s.spin
> +++ /dev/null
> @@ -1,196 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * This version omits irq/NMI handlers.  It does not have liveness checks.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_NOHZ is
> - * set to "2", then the validation will cover 0, 1, and 2 loops.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 3
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/*
> - * The grace_period() process uses this to track its progress through
> - * each phase, thus allowing the other processes to make sure that
> - * grace_period() does not advance prematurely.
> - */
> -
> -#define GP_IDLE		0
> -#define GP_WAITING	1
> -#define GP_DONE		2
> -byte grace_period_state = GP_DONE;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  As noted earlier, the grace_period_state
> -	 * variable allows the other processes to scream if we jump
> -	 * the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr == snap) && ((curr & 1) == 0) ->
> -				break;
> -			:: (curr - snap) > 2 || (snap & 1) == 0 ->
> -				break;
> -			:: 1 -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  As noted earlier, the grace_period_state
> -	 * variable allows the other processes to scream if we jump
> -	 * the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr == snap) && ((curr & 1) == 0) ->
> -				break;
> -			:: (curr != snap) ->
> -				break;
> -			:: 1 -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -}
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  The old_gp_idle
> - * variable is used to verify that grace_period() does not incorrectly
> - * advance while this process is not in nohz mode.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		tmp = dynticks_progress_counter;
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			old_gp_idle = (grace_period_state == GP_IDLE);
> -			assert((dynticks_progress_counter & 1) == 1);
> -		}
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		atomic {
> -			tmp = dynticks_progress_counter;
> -			assert(!old_gp_idle || grace_period_state != GP_DONE);
> -		}
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 0);
> -		}
> -		i++;
> -	od;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-base-sl-busted.spin b/CodeSamples/appendix/formal/dyntickRCU-base-sl-busted.spin
> deleted file mode 100644
> index 46e97fd..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-base-sl-busted.spin
> +++ /dev/null
> @@ -1,224 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * This version omits irq/NMI handlers.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_NOHZ is
> - * set to "2", then the validation will cover 0, 1, and 2 loops.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 3
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/*
> - * The grace_period() process uses this to track its progress through
> - * each phase, thus allowing the other processes to make sure that
> - * grace_period() does not advance prematurely.
> - */
> -
> -#define GP_IDLE		0
> -#define GP_WAITING	1
> -#define GP_DONE		2
> -byte grace_period_state = GP_DONE;
> -
> -/*
> - * The following variables mark completion of the corresponding processes.
> - * This is used in grace_period() to check forward progress guarantees.
> - */
> -
> -bit dyntick_nohz_done = 0;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - *
> - * This code verifies forward progress: once all of the other processes
> - * have terminated, the grace_period() code must not block.  In addition,
> - * this code maintains a progress indicator in the grace_period_state
> - * variable.  It is an error for grace_period() to advance from GP_IDLE
> - * to GP_DONE unless all the other processes are simultaneously in nohz
> - * mode at some point during the transition.
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -	bit shouldexit;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().  The shouldexit
> -	 * check ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr == snap) && ((curr & 1) == 0) ->
> -				break;
> -			:: (curr - snap) > 2 || (snap & 1) == 0 ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().  The shouldexit
> -	 * check again ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr == snap) && ((curr & 1) == 0) ->
> -				break;
> -			:: (curr != snap) ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -}
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  The old_gp_idle
> - * variable is used to verify that grace_period() does not incorrectly
> - * advance while this process is not in nohz mode.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		tmp = dynticks_progress_counter;
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			old_gp_idle = (grace_period_state == GP_IDLE);
> -			assert((dynticks_progress_counter & 1) == 1);
> -		}
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		atomic {
> -			tmp = dynticks_progress_counter;
> -			assert(!old_gp_idle || grace_period_state != GP_DONE);
> -		}
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 0);
> -		}
> -		i++;
> -	od;
> -	dyntick_nohz_done = 1;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-base-sl.spin b/CodeSamples/appendix/formal/dyntickRCU-base-sl.spin
> deleted file mode 100644
> index 3655e87..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-base-sl.spin
> +++ /dev/null
> @@ -1,220 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * This version omits irq/NMI handlers.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_NOHZ is
> - * set to "2", then the validation will cover 0, 1, and 2 loops.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 3
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/*
> - * The grace_period() process uses this to track its progress through
> - * each phase, thus allowing the other processes to make sure that
> - * grace_period() does not advance prematurely.
> - */
> -
> -#define GP_IDLE		0
> -#define GP_WAITING	1
> -#define GP_DONE		2
> -byte grace_period_state = GP_DONE;
> -
> -/*
> - * The following variables mark completion of the corresponding processes.
> - * This is used in grace_period() to check forward progress guarantees.
> - */
> -
> -bit dyntick_nohz_done = 0;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - *
> - * This code verifies forward progress: once all of the other processes
> - * have terminated, the grace_period() code must not block.  In addition,
> - * this code maintains a progress indicator in the grace_period_state
> - * variable.  It is an error for grace_period() to advance from GP_IDLE
> - * to GP_DONE unless all the other processes are simultaneously in nohz
> - * mode at some point during the transition.
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -	bit shouldexit;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().  The shouldexit
> -	 * check ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr - snap) >= 2 || (curr & 1) == 0 ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().  The shouldexit
> -	 * check again ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr != snap) || ((curr & 1) == 0) ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -}
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  The old_gp_idle
> - * variable is used to verify that grace_period() does not incorrectly
> - * advance while this process is not in nohz mode.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		tmp = dynticks_progress_counter;
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			old_gp_idle = (grace_period_state == GP_IDLE);
> -			assert((dynticks_progress_counter & 1) == 1);
> -		}
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		atomic {
> -			tmp = dynticks_progress_counter;
> -			assert(!old_gp_idle || grace_period_state != GP_DONE);
> -		}
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 0);
> -		}
> -		i++;
> -	od;
> -	dyntick_nohz_done = 1;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-base.spin b/CodeSamples/appendix/formal/dyntickRCU-base.spin
> deleted file mode 100644
> index 29f0345..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-base.spin
> +++ /dev/null
> @@ -1,164 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * This version omits irq/NMI handlers.  It does not have either safety
> - * or liveness checks.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_NOHZ is
> - * set to "2", then the validation will cover 0, 1, and 2 loops.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 3
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter().
> -	 */
> -
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		snap = dynticks_progress_counter;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr == snap) && ((curr & 1) == 0) ->
> -				break;
> -			:: (curr - snap) > 2 || (snap & 1) == 0 ->
> -				break;
> -			:: 1 -> skip;
> -			fi;
> -		}
> -	od;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.
> -	 */
> -
> -	snap = dynticks_progress_counter;
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr == snap) && ((curr & 1) == 0) ->
> -				break;
> -			:: (curr != snap) ->
> -				break;
> -			:: 1 -> skip;
> -			fi;
> -		}
> -	od;
> -}
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz().
> -		 */
> -
> -		tmp = dynticks_progress_counter;
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 1);
> -		}
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz().
> -		 */
> -
> -		tmp = dynticks_progress_counter;
> -		atomic {
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 0);
> -		}
> -		i++;
> -	od;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-irq-nmi-ssl.spin b/CodeSamples/appendix/formal/dyntickRCU-irq-nmi-ssl.spin
> deleted file mode 100644
> index 9a01477..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-irq-nmi-ssl.spin
> +++ /dev/null
> @@ -1,506 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - * MAX_DYNTICK_LOOP_IRQ: The number of interrupts (possibly arbitrarily
> - *	nested) to be received.
> - * MAX_DYNTICK_LOOP_NMI: The number of NMIs (never nested) to be received.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_IRQ is
> - * set to "2", then the validation will cover 0, 1, and 2 interrupts,
> - * arbitrarily nested.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 1
> -#define MAX_DYNTICK_LOOP_IRQ 2
> -#define MAX_DYNTICK_LOOP_NMI 1
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/* Set when IRQ code is running, to allow mainline code to lock itself out. */
> -
> -bit in_dyntick_irq = 0;
> -
> -/*
> - * Set when NMI code is running, to allow both mainline code and irq handler
> - * code to lock itself out.
> - */
> -
> -bit in_dyntick_nmi = 0;
> -
> -/*
> - * The grace_period() process uses this to track its progress through
> - * each phase, thus allowing the other processes to make sure that
> - * grace_period() does not advance prematurely.
> - */
> -
> -#define GP_IDLE		0
> -#define GP_WAITING	1
> -#define GP_DONE		2
> -byte grace_period_state = GP_DONE;
> -
> -/*
> - * The following variables mark completion of the corresponding processes.
> - * This is used in grace_period() to check forward progress guarantees.
> - */
> -
> -bit dyntick_nohz_done = 0;
> -bit dyntick_irq_done = 0;
> -bit dyntick_nmi_done = 0;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - *
> - * This code verifies forward progress: once all of the other processes
> - * have terminated, the grace_period() code must not block.  In addition,
> - * this code maintains a progress indicator in the grace_period_state
> - * variable.  It is an error for grace_period() to advance from GP_IDLE
> - * to GP_DONE unless all the other processes are simultaneously in nohz
> - * mode at some point during the transition.
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -	bit shouldexit;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		printf("MAX_DYNTICK_LOOP_IRQ = %d\n", MAX_DYNTICK_LOOP_IRQ);
> -		printf("MAX_DYNTICK_LOOP_NMI = %d\n", MAX_DYNTICK_LOOP_NMI);
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().  The shouldexit
> -	 * check ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done &&
> -				     dyntick_irq_done &&
> -				     dyntick_nmi_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr - snap) >= 2 || (curr & 1) == 0 ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().  The shouldexit
> -	 * check again ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done &&
> -				     dyntick_irq_done &&
> -				     dyntick_nmi_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr != snap) || ((curr & 1) == 0) ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -}
> -
> -/*
> - * Macro that allows dyntick_irq() and dyntick_nmi() code to run atomically
> - * with respect to dyntick_nohz(), but still allows dyntick_irq() and
> - * dyntick_nmi() to be interleaved with other processes.
> - */
> -
> -#define EXECUTE_MAINLINE(label, stmt) \
> -label: skip; \
> -		atomic { \
> -			if \
> -			:: in_dyntick_irq || in_dyntick_nmi -> goto label; \
> -			:: else -> stmt; \
> -			fi; \
> -		} \
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  The old_gp_idle
> - * variable is used to verify that grace_period() does not incorrectly
> - * advance while this process is not in nohz mode.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		EXECUTE_MAINLINE(stmt1, tmp = dynticks_progress_counter)
> -		EXECUTE_MAINLINE(stmt2, dynticks_progress_counter = tmp + 1; old_gp_idle = (grace_period_state == GP_IDLE); assert((dynticks_progress_counter & 1) == 1))
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		EXECUTE_MAINLINE(stmt3, tmp = dynticks_progress_counter; assert(!old_gp_idle || grace_period_state != GP_DONE))
> -		EXECUTE_MAINLINE(stmt4, dynticks_progress_counter = tmp + 1; assert((dynticks_progress_counter & 1) == 0))
> -		i++;
> -	od;
> -	dyntick_nohz_done = 1;
> -}
> -
> -/*
> - * Macro that allows dyntick_nmi() code to run atomically with respect
> - * to dyntick_irq(), but still allows dyntick_nmi() to be interleaved
> - * with other processes.  This macro must be used when accessing
> - * external state, but statements that access state that is purely
> - * local to dyntick_irq() can be permitted to run in parallel with
> - * dyntick_nmi().  In addition, global state that is shared only
> - * with dyntick_nohz() may also be modified even when dyntick_nmi()
> - * is running.
> - */
> -
> -#define EXECUTE_IRQ(label, stmt) \
> -label: skip; \
> -		atomic { \
> -			if \
> -			:: in_dyntick_nmi -> goto label; \
> -			:: else -> stmt; \
> -			fi; \
> -		} \
> -
> -/*
> - * Validation code corresponding to rcu_irq_enter() and rcu_irq_exit().
> - */
> -
> -proctype dyntick_irq()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	byte j = 0;
> -	bit old_gp_idle;
> -	bit outermost;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_IRQ && j >= MAX_DYNTICK_LOOP_IRQ -> break;
> -	:: i < MAX_DYNTICK_LOOP_IRQ ->
> -
> -		/* Tell dyntick_nohz() that we are in interrupt handler. */
> -
> -		atomic {
> -			outermost = (in_dyntick_irq == 0);
> -			in_dyntick_irq = 1;
> -		}
> -
> -		/* Validation code corresponding to rcu_irq_enter(). */
> -
> -stmt1: skip;
> -		atomic {
> -			if
> -			:: in_dyntick_nmi -> goto stmt1;
> -			:: !in_dyntick_nmi && rcu_update_flag ->
> -				goto stmt1_then;
> -			:: else -> goto stmt1_else;
> -			fi;
> -		}
> -stmt1_then: skip;
> -		EXECUTE_IRQ(stmt1_1, tmp = rcu_update_flag)
> -		EXECUTE_IRQ(stmt1_2, rcu_update_flag = tmp + 1)
> -stmt1_else: skip;
> -stmt2: skip;	atomic {
> -			if
> -			:: in_dyntick_nmi -> goto stmt2;
> -			:: !in_dyntick_nmi &&
> -			   !in_interrupt &&
> -			   (dynticks_progress_counter & 1) == 0 ->
> -			   	goto stmt2_then;
> -			:: else -> goto stmt2_else;
> -			fi;
> -		}
> -stmt2_then: skip;
> -		EXECUTE_IRQ(stmt2_1, tmp = dynticks_progress_counter)
> -		EXECUTE_IRQ(stmt2_2, dynticks_progress_counter = tmp + 1)
> -		EXECUTE_IRQ(stmt2_3, tmp = rcu_update_flag)
> -		EXECUTE_IRQ(stmt2_4, rcu_update_flag = tmp + 1)
> -stmt2_else: skip;
> -
> -		/* 
> -		 * And a snippet from __irq_enter() corresponding to
> -		 * the add_preempt_count().
> -		 */
> -
> -		EXECUTE_IRQ(stmt3, tmp = in_interrupt)
> -		EXECUTE_IRQ(stmt4, in_interrupt = tmp + 1)
> -
> -		/* Capture state to see if grace_period() is behaving. */
> -
> -stmt5: skip;
> -		atomic {
> -			if
> -			:: in_dyntick_nmi -> goto stmt4;
> -			:: !in_dyntick_nmi && outermost ->
> -				old_gp_idle = (grace_period_state == GP_IDLE);
> -			:: else -> skip;
> -			fi;
> -		}
> -
> -		/* Count the entry for termination and nesting. */
> -
> -		i++;
> -
> -	/* Note that we cannot exit a handler we have not yet entered! */
> -
> -	:: j < i ->
> -
> -		/* See if we can catch grace_period() misbehaving. */
> -
> -stmt6: skip;
> -		atomic {
> -			if
> -			:: in_dyntick_nmi -> goto stmt6;
> -			:: !in_dyntick_nmi && j + 1 == i ->
> -				assert(!old_gp_idle ||
> -				       grace_period_state != GP_DONE);
> -			:: else -> skip;
> -			fi;
> -		}
> -
> -		/*
> -		 * Validation code corresponding to the sub_preempt_count()
> -		 * in __irq_exit().
> -		 */
> -
> -		EXECUTE_IRQ(stmt7, tmp = in_interrupt);
> -		EXECUTE_IRQ(stmt8, in_interrupt = tmp - 1);
> -
> -		/* Validation code corresponding to rcu_irq_exit(). */
> -
> -stmt9: skip;
> -		atomic {
> -			if
> -			:: in_dyntick_nmi -> goto stmt9;
> -			:: !in_dyntick_nmi && rcu_update_flag != 0 ->
> -				goto stmt9_then;
> -			:: else -> goto stmt9_else;
> -			fi;
> -		}
> -stmt9_then: skip;
> -		EXECUTE_IRQ(stmt9_1, tmp = rcu_update_flag)
> -		EXECUTE_IRQ(stmt9_2, rcu_update_flag = tmp - 1)
> -stmt9_3: skip;
> -		atomic {
> -			if
> -			:: in_dyntick_nmi -> goto stmt9_3;
> -			:: !in_dyntick_nmi && rcu_update_flag == 0 ->
> -				goto stmt9_3_then;
> -			:: else -> goto stmt9_3_else;
> -			fi;
> -		}
> -stmt9_3_then: skip;
> -		EXECUTE_IRQ(stmt9_3_1, tmp = dynticks_progress_counter)
> -		EXECUTE_IRQ(stmt9_3_2, dynticks_progress_counter = tmp + 1)
> -stmt9_3_else:
> -stmt9_else: skip;
> -
> -		/*
> -		 * Count the exit and let dyntick_nohz() know if we
> -		 * have completely exited a nested set of interrupts.
> -		 */
> -
> -		atomic {
> -			j++;
> -			in_dyntick_irq = (i != j);
> -		}
> -	od;
> -	dyntick_irq_done = 1;
> -}
> -
> -/*
> - * Validation code corresponding to rcu_irq_enter() and rcu_irq_exit().
> - * Similar to dyntick_irq(), but done atomically.  This is a bit of
> - * a cheat, since the code would not really be atomic with respect
> - * to grace_period(), but one step at a time.
> - */
> -
> -proctype dyntick_nmi()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NMI -> break;
> -	:: i < MAX_DYNTICK_LOOP_NMI ->
> -
> -		/* Tell dyntick_nohz() that we are in interrupt handler. */
> -
> -		in_dyntick_nmi = 1;
> -
> -		/* Validation code corresponding to rcu_irq_enter(). */
> -
> -		if
> -		:: rcu_update_flag > 0 ->
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp + 1;
> -		:: else -> skip;
> -		fi;
> -		if
> -		:: !in_interrupt && (dynticks_progress_counter & 1) == 0 ->
> -			tmp = dynticks_progress_counter;
> -			dynticks_progress_counter = tmp + 1;
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp + 1;
> -		:: else -> skip;
> -		fi;
> -
> -		/* 
> -		 * And a snippet from __irq_enter() corresponding to
> -		 * the add_preempt_count().
> -		 */
> -
> -		tmp = in_interrupt;
> -		in_interrupt = tmp + 1;
> -
> -		/* Capture state to see if grace_period() is behaving. */
> -
> -		old_gp_idle = (grace_period_state == GP_IDLE);
> -
> -		/* See if we can catch grace_period() misbehaving. */
> -
> -		assert(!old_gp_idle || grace_period_state != GP_DONE);
> -
> -		/*
> -		 * Validation code corresponding to the sub_preempt_count()
> -		 * in __irq_exit().
> -		 */
> -
> -		tmp = in_interrupt;
> -		in_interrupt = tmp - 1;
> -
> -		/* Validation code corresponding to rcu_irq_exit(). */
> -
> -		if
> -		:: rcu_update_flag != 0 ->
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp - 1;
> -			if
> -			:: rcu_update_flag == 0 ->
> -				tmp = dynticks_progress_counter;
> -				dynticks_progress_counter = tmp + 1;
> -			:: else -> skip;
> -			fi;
> -		:: else -> skip;
> -		fi;
> -
> -		/*
> -		 * Count the exit and let dyntick_irq() and dyntick_nohz()
> -		 * know that we have exited the NMI.
> -		 */
> -
> -		atomic {
> -			i++;
> -			in_dyntick_nmi = 0;
> -		}
> -	od;
> -	dyntick_nmi_done = 1;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run dyntick_irq();
> -		run dyntick_nmi();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-irq-ssl.spin b/CodeSamples/appendix/formal/dyntickRCU-irq-ssl.spin
> deleted file mode 100644
> index 43ba53b..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-irq-ssl.spin
> +++ /dev/null
> @@ -1,356 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * This version omits NMI handlers.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - * MAX_DYNTICK_LOOP_IRQ: The number of interrupts (possibly arbitrarily
> - *	nested) to be received.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_IRQ is
> - * set to "2", then the validation will cover 0, 1, and 2 interrupts,
> - * arbitrarily nested.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 3
> -#define MAX_DYNTICK_LOOP_IRQ 3
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/* Set when IRQ code is running, to allow mainline code to lock itself out. */
> -
> -bit in_dyntick_irq = 0;
> -
> -/*
> - * The grace_period() process uses this to track its progress through
> - * each phase, thus allowing the other processes to make sure that
> - * grace_period() does not advance prematurely.
> - */
> -
> -#define GP_IDLE		0
> -#define GP_WAITING	1
> -#define GP_DONE		2
> -byte grace_period_state = GP_DONE;
> -
> -/*
> - * The following variables mark completion of the corresponding processes.
> - * This is used in grace_period() to check forward progress guarantees.
> - */
> -
> -bit dyntick_nohz_done = 0;
> -bit dyntick_irq_done = 0;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - *
> - * This code verifies forward progress: once all of the other processes
> - * have terminated, the grace_period() code must not block.  In addition,
> - * this code maintains a progress indicator in the grace_period_state
> - * variable.  It is an error for grace_period() to advance from GP_IDLE
> - * to GP_DONE unless all the other processes are simultaneously in nohz
> - * mode at some point during the transition.
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -	bit shouldexit;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		printf("MAX_DYNTICK_LOOP_IRQ = %d\n", MAX_DYNTICK_LOOP_IRQ);
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().  The shouldexit
> -	 * check ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done && dyntick_irq_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr - snap) >= 2 || (curr & 1) == 0 ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().  The shouldexit
> -	 * check again ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done && dyntick_irq_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr != snap) || ((curr & 1) == 0) ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -}
> -
> -/*
> - * Macro that allows dyntick_irq() code to run atomically with respect
> - * to dyntick_nohz(), but still allows dyntick_irq() to be interleaved
> - * with other processes.
> - */
> -
> -#define EXECUTE_MAINLINE(label, stmt) \
> -label: skip; \
> -		atomic { \
> -			if \
> -			:: in_dyntick_irq -> goto label; \
> -			:: else -> stmt; \
> -			fi; \
> -		} \
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  The old_gp_idle
> - * variable is used to verify that grace_period() does not incorrectly
> - * advance while this process is not in nohz mode.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		EXECUTE_MAINLINE(stmt1, tmp = dynticks_progress_counter)
> -		EXECUTE_MAINLINE(stmt2,
> -				 dynticks_progress_counter = tmp + 1;
> -				 old_gp_idle = (grace_period_state == GP_IDLE);
> -				 assert((dynticks_progress_counter & 1) == 1))
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		EXECUTE_MAINLINE(stmt3,
> -			tmp = dynticks_progress_counter;
> -			assert(!old_gp_idle || grace_period_state != GP_DONE))
> -		EXECUTE_MAINLINE(stmt4,
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 0))
> -		i++;
> -	od;
> -	dyntick_nohz_done = 1;
> -}
> -
> -/*
> - * Validation code corresponding to rcu_irq_enter() and rcu_irq_exit().
> - */
> -
> -proctype dyntick_irq()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	byte j = 0;
> -	bit old_gp_idle;
> -	bit outermost;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_IRQ && j >= MAX_DYNTICK_LOOP_IRQ -> break;
> -	:: i < MAX_DYNTICK_LOOP_IRQ ->
> -
> -		/* Tell dyntick_nohz() that we are in interrupt handler. */
> -
> -		atomic {
> -			outermost = (in_dyntick_irq == 0);
> -			in_dyntick_irq = 1;
> -		}
> -
> -		/* Validation code corresponding to rcu_irq_enter(). */
> -
> -		if
> -		:: rcu_update_flag > 0 ->
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp + 1;
> -		:: else -> skip;
> -		fi;
> -		if
> -		:: !in_interrupt && (dynticks_progress_counter & 1) == 0 ->
> -			tmp = dynticks_progress_counter;
> -			dynticks_progress_counter = tmp + 1;
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp + 1;
> -		:: else -> skip;
> -		fi;
> -
> -		/* 
> -		 * And a snippet from __irq_enter() corresponding to
> -		 * the add_preempt_count().
> -		 */
> -
> -		tmp = in_interrupt;
> -		in_interrupt = tmp + 1;
> -
> -		/* Capture state to see if grace_period() is behaving. */
> -
> -		atomic {
> -			if
> -			:: outermost ->
> -				old_gp_idle = (grace_period_state == GP_IDLE);
> -			:: else -> skip;
> -			fi;
> -		}
> -
> -		/* Count the entry for termination and nesting. */
> -
> -		i++;
> -
> -	/* Note that we cannot exit a handler we have not yet entered! */
> -
> -	:: j < i ->
> -
> -		/* See if we can catch grace_period() misbehaving. */
> -
> -		atomic {
> -			if
> -			:: j + 1 == i ->
> -				assert(!old_gp_idle ||
> -				       grace_period_state != GP_DONE);
> -			:: else -> skip;
> -			fi;
> -		}
> -
> -		/*
> -		 * Validation code corresponding to the sub_preempt_count()
> -		 * in __irq_exit().
> -		 */
> -
> -		tmp = in_interrupt;
> -		in_interrupt = tmp - 1;
> -
> -		/* Validation code corresponding to rcu_irq_exit(). */
> -
> -		if
> -		:: rcu_update_flag != 0 ->
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp - 1;
> -			if
> -			:: rcu_update_flag == 0 ->
> -				tmp = dynticks_progress_counter;
> -				dynticks_progress_counter = tmp + 1;
> -			:: else -> skip;
> -			fi;
> -		:: else -> skip;
> -		fi;
> -
> -		/*
> -		 * Count the exit and let dyntick_nohz() know if we
> -		 * have completely exited a nested set of interrupts.
> -		 */
> -
> -		atomic {
> -			j++;
> -			in_dyntick_irq = (i != j);
> -		}
> -	od;
> -	dyntick_irq_done = 1;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run dyntick_irq();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-irqnn-ssl.spin b/CodeSamples/appendix/formal/dyntickRCU-irqnn-ssl.spin
> deleted file mode 100644
> index 8157a9f..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCU-irqnn-ssl.spin
> +++ /dev/null
> @@ -1,330 +0,0 @@
> -/*
> - * Tests a variation of RCU-dyntick interaction in the Linux 2.6.25-rc4
> - * kernel.  Note that portions of this are derived from Linux kernel code,
> - * portions of which are licensed under a GPLv2-only license.
> - *
> - * This version omits NMI handlers, and disallows nested irq handlers.
> - *
> - * 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 of the License, 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, you can access it online at
> - * http://www.gnu.org/licenses/gpl-2.0.html.
> - *
> - * Copyright (c) 2008 IBM Corporation.
> - */
> -
> -/*
> - * Parameters:
> - *
> - * MAX_DYNTICK_LOOP_NOHZ: The number of non-idle process level bursts
> - *	of work.
> - * MAX_DYNTICK_LOOP_IRQ: The number of interrupts (possibly arbitrarily
> - *	nested) to be received.
> - *
> - * Setting a given value for a given parameter covers all values up to
> - * and including the specified value.  So, if MAX_DYNTICK_LOOP_IRQ is
> - * set to "2", then the validation will cover 0, 1, and 2 interrupts.
> - */
> -
> -#define MAX_DYNTICK_LOOP_NOHZ 3
> -#define MAX_DYNTICK_LOOP_IRQ 3
> -
> -/* Variables corresponding to the 2.6.25-rc4 per-CPU variables. */
> -
> -byte dynticks_progress_counter = 0;
> -byte rcu_update_flag = 0;
> -byte in_interrupt = 0;
> -
> -/* Set when IRQ code is running, to allow mainline code to lock itself out. */
> -
> -bit in_dyntick_irq = 0;
> -
> -/*
> - * The grace_period() process uses this to track its progress through
> - * each phase, thus allowing the other processes to make sure that
> - * grace_period() does not advance prematurely.
> - */
> -
> -#define GP_IDLE		0
> -#define GP_WAITING	1
> -#define GP_DONE		2
> -byte grace_period_state = GP_DONE;
> -
> -/*
> - * The following variables mark completion of the corresponding processes.
> - * This is used in grace_period() to check forward progress guarantees.
> - */
> -
> -bit dyntick_nohz_done = 0;
> -bit dyntick_irq_done = 0;
> -
> -/*
> - * Validation code for the slice of the preemptible-RCU code that
> - * interacts with the dynticks subsystem.  This is set up to match
> - * the code in 2.6.25-rc4, namely dyntick_save_progress_counter(),
> - * rcu_try_flip_waitack_needed(), rcu_try_flip_waitmb_needed(),
> - * and portions of rcu_try_flip_waitack() and rcu_try_flip_waitmb().
> - *
> - * This code verifies forward progress: once all of the other processes
> - * have terminated, the grace_period() code must not block.  In addition,
> - * this code maintains a progress indicator in the grace_period_state
> - * variable.  It is an error for grace_period() to advance from GP_IDLE
> - * to GP_DONE unless all the other processes are simultaneously in nohz
> - * mode at some point during the transition.
> - */
> -
> -proctype grace_period()
> -{
> -	byte curr;
> -	byte snap;
> -	bit shouldexit;
> -
> -	/*
> -	 * A little code from rcu_try_flip_idle() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		printf("MAX_DYNTICK_LOOP_NOHZ = %d\n", MAX_DYNTICK_LOOP_NOHZ);
> -		printf("MAX_DYNTICK_LOOP_IRQ = %d\n", MAX_DYNTICK_LOOP_IRQ);
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitack()
> -	 * and its call to rcu_try_flip_waitack_needed().  The shouldexit
> -	 * check ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done && dyntick_irq_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr - snap) >= 2 || (curr & 1) == 0 ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -
> -	/*
> -	 * A little code from rcu_try_flip_waitzero() and its call
> -	 * to dyntick_save_progress_counter(), plus a bunch of
> -	 * validation code.  The shouldexit variable is for the
> -	 * later liveness checks.  As noted earlier, the
> -	 * grace_period_state variable allows the other processes
> -	 * to scream if we jump the gun here.
> -	 */
> -
> -	grace_period_state = GP_IDLE;
> -	atomic {
> -		shouldexit = 0;
> -		snap = dynticks_progress_counter;
> -		grace_period_state = GP_WAITING;
> -	}
> -
> -	/*
> -	 * Each pass through the following loop corresponds to an
> -	 * invocation of the scheduling-clock interrupt handler,
> -	 * specifically a little code from rcu_try_flip_waitmb()
> -	 * and its call to rcu_try_flip_waitmb_needed().  The shouldexit
> -	 * check again ensures that we scream if we cannot immediately exit
> -	 * the loop after all other proceses have completed.
> -	 */
> -
> -	do
> -	:: 1 ->
> -		atomic {
> -			assert(!shouldexit);
> -			shouldexit = dyntick_nohz_done && dyntick_irq_done;
> -			curr = dynticks_progress_counter;
> -			if
> -			:: (curr != snap) || ((curr & 1) == 0) ->
> -				break;
> -			:: else -> skip;
> -			fi;
> -		}
> -	od;
> -	grace_period_state = GP_DONE;
> -}
> -
> -/*
> - * Macro that allows dyntick_irq() code to run atomically with respect
> - * to dyntick_nohz(), but still allows dyntick_irq() to be interleaved
> - * with other processes.
> - */
> -
> -#define EXECUTE_MAINLINE(label, stmt) \
> -label: skip; \
> -		atomic { \
> -			if \
> -			:: in_dyntick_irq -> goto label; \
> -			:: else -> stmt; \
> -			fi; \
> -		} \
> -
> -/*
> - * Validation code for the rcu_enter_nohz() and rcu_exit_nohz()
> - * functions.  Each pass through this process's loop corresponds
> - * to exiting nohz mode, then re-entering it.  The old_gp_idle
> - * variable is used to verify that grace_period() does not incorrectly
> - * advance while this process is not in nohz mode.  This code also
> - * includes assertions corresponding to the WARN_ON() calls in
> - * rcu_exit_nohz() and rcu_enter_nohz().
> - */
> -
> -proctype dyntick_nohz()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_NOHZ -> break;
> -	:: i < MAX_DYNTICK_LOOP_NOHZ ->
> -
> -		/*
> -		 * The following corresponds to rcu_exit_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		EXECUTE_MAINLINE(stmt1, tmp = dynticks_progress_counter)
> -		EXECUTE_MAINLINE(stmt2,
> -				 dynticks_progress_counter = tmp + 1;
> -				 old_gp_idle = (grace_period_state == GP_IDLE);
> -				 assert((dynticks_progress_counter & 1) == 1))
> -
> -		/*
> -		 * The following corresponds to rcu_enter_nohz(), along
> -		 * with code to check for grace_period() jumping the gun.
> -		 */
> -
> -		EXECUTE_MAINLINE(stmt3,
> -			tmp = dynticks_progress_counter;
> -			assert(!old_gp_idle || grace_period_state != GP_DONE))
> -		EXECUTE_MAINLINE(stmt4,
> -			dynticks_progress_counter = tmp + 1;
> -			assert((dynticks_progress_counter & 1) == 0))
> -		i++;
> -	od;
> -	dyntick_nohz_done = 1;
> -}
> -
> -/*
> - * Validation code corresponding to rcu_irq_enter() and rcu_irq_exit().
> - */
> -
> -proctype dyntick_irq()
> -{
> -	byte tmp;
> -	byte i = 0;
> -	bit old_gp_idle;
> -
> -	do
> -	:: i >= MAX_DYNTICK_LOOP_IRQ -> break;
> -	:: i < MAX_DYNTICK_LOOP_IRQ ->
> -
> -		/* Tell dyntick_nohz() that we are in interrupt handler. */
> -
> -		in_dyntick_irq = 1;
> -
> -		/* Validation code corresponding to rcu_irq_enter(). */
> -
> -		if
> -		:: rcu_update_flag > 0 ->
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp + 1;
> -		:: else -> skip;
> -		fi;
> -		if
> -		:: !in_interrupt && (dynticks_progress_counter & 1) == 0 ->
> -			tmp = dynticks_progress_counter;
> -			dynticks_progress_counter = tmp + 1;
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp + 1;
> -		:: else -> skip;
> -		fi;
> -
> -		/* 
> -		 * And a snippet from __irq_enter() corresponding to
> -		 * the add_preempt_count().
> -		 */
> -
> -		tmp = in_interrupt;
> -		in_interrupt = tmp + 1;
> -
> -		/* Capture state to see if grace_period() is behaving. */
> -
> -		old_gp_idle = (grace_period_state == GP_IDLE);
> -
> -		/* See if we can catch grace_period() misbehaving. */
> -
> -		assert(!old_gp_idle || grace_period_state != GP_DONE);
> -
> -		/*
> -		 * Validation code corresponding to the sub_preempt_count()
> -		 * in __irq_exit().
> -		 */
> -
> -		tmp = in_interrupt;
> -		in_interrupt = tmp - 1;
> -
> -		/* Validation code corresponding to rcu_irq_exit(). */
> -
> -		if
> -		:: rcu_update_flag != 0 ->
> -			tmp = rcu_update_flag;
> -			rcu_update_flag = tmp - 1;
> -			if
> -			:: rcu_update_flag == 0 ->
> -				tmp = dynticks_progress_counter;
> -				dynticks_progress_counter = tmp + 1;
> -			:: else -> skip;
> -			fi;
> -		:: else -> skip;
> -		fi;
> -
> -		/*
> -		 * Count the exit and let dyntick_nohz() know if we
> -		 * have completely exited a nested set of interrupts.
> -		 * Count the irq handler for termination. */
> -		 */
> -
> -		atomic {
> -			in_dyntick_irq = 0;
> -			i++;
> -		}
> -	od;
> -	dyntick_irq_done = 1;
> -}
> -
> -init {
> -	atomic {
> -		run dyntick_nohz();
> -		run dyntick_irq();
> -		run grace_period();
> -	}
> -}
> diff --git a/CodeSamples/appendix/formal/dyntickRCUtarball.sh b/CodeSamples/appendix/formal/dyntickRCUtarball.sh
> deleted file mode 100644
> index ee6b104..0000000
> --- a/CodeSamples/appendix/formal/dyntickRCUtarball.sh
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -rm -rf dyntickRCU
> -mkdir dyntickRCU
> -cp	dyntickRCU-base-sl-busted.spin.trail.txt \
> -	dyntickRCU-base-s.spin \
> -	dyntickRCU-irq-ssl.spin \
> -	RCUpreemptStates.fig \
> -	dyntickRCU-irqnn-ssl.spin \
> -	dyntickRCU-irq-nmi-ssl.spin \
> -	runspin.sh \
> -	dyntickRCU-base-sl.spin \
> -	dyntickRCU-base-sl-busted.spin.trail \
> -	dyntickRCU-base-sl-busted.spin \
> -	RCUpreemptStates.png \
> -	dyntickRCU-base.spin \
> -	RCUpreemptStates.eps \
> -	dyntickRCU.$1.html \
> -	dyntickRCU
> -tar -czf dyntickRCU.$1.tgz dyntickRCU
> diff --git a/CodeSamples/appendix/formal/runspin.sh b/CodeSamples/appendix/formal/runspin.sh
> deleted file mode 100644
> index 0978f4c..0000000
> --- a/CodeSamples/appendix/formal/runspin.sh
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -#!/bin/sh
> -#
> -# Run a test.  Specify the test type as the first argument, for example:
> -#
> -#	sh runtest.sh base
> -#
> -# will run the "dyntickRCU-base.spin model".  Be sure to edit the
> -# MAX_DYNTICK_LOOP_* parameters as needed to fit your needs and
> -# memory size.
> -#
> -# 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 of the License, 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, you can access it online at
> -# http://www.gnu.org/licenses/gpl-2.0.html.
> -#
> -# Copyright (c) 2008 Paul E. McKenney, IBM Corporation.
> -
> -type=${1-irq-nmi-ssl}
> -spin -a dyntickRCU-$type.spin
> -cc -DSAFETY -o pan pan.c
> -grep '^#.*DYN' dyntickRCU-$type.spin
> -./pan
> diff --git a/CodeSamples/analysis/promela/.gitignore b/CodeSamples/formal/promela/.gitignore
> similarity index 100%
> rename from CodeSamples/analysis/promela/.gitignore
> rename to CodeSamples/formal/promela/.gitignore
> diff --git a/CodeSamples/analysis/promela/atomicincrement.spin b/CodeSamples/formal/promela/atomicincrement.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/atomicincrement.spin
> rename to CodeSamples/formal/promela/atomicincrement.spin
> diff --git a/CodeSamples/appendix/formal/.gitignore b/CodeSamples/formal/promela/dyntick/.gitignore
> similarity index 100%
> rename from CodeSamples/appendix/formal/.gitignore
> rename to CodeSamples/formal/promela/dyntick/.gitignore
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-base-s.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-base-s.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-base-s.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-base-s.spin
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-base-sl-busted.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-base-sl-busted.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-base-sl-busted.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-base-sl-busted.spin
> diff --git a/CodeSamples/appendix/formal/dyntickRCU-base-sl-busted.spin.trail.txt b/CodeSamples/formal/promela/dyntick/dyntickRCU-base-sl-busted.spin.trail.txt
> similarity index 100%
> rename from CodeSamples/appendix/formal/dyntickRCU-base-sl-busted.spin.trail.txt
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-base-sl-busted.spin.trail.txt
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-base-sl.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-base-sl.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-base-sl.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-base-sl.spin
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-base.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-base.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-base.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-base.spin
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-irq-nmi-ssl.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-irq-nmi-ssl.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-irq-nmi-ssl.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-irq-nmi-ssl.spin
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-irq-ssl.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-irq-ssl.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-irq-ssl.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-irq-ssl.spin
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCU-irqnn-ssl.spin b/CodeSamples/formal/promela/dyntick/dyntickRCU-irqnn-ssl.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCU-irqnn-ssl.spin
> rename to CodeSamples/formal/promela/dyntick/dyntickRCU-irqnn-ssl.spin
> diff --git a/CodeSamples/analysis/promela/dyntick/dyntickRCUtarball.sh b/CodeSamples/formal/promela/dyntick/dyntickRCUtarball.sh
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/dyntickRCUtarball.sh
> rename to CodeSamples/formal/promela/dyntick/dyntickRCUtarball.sh
> diff --git a/CodeSamples/analysis/promela/dyntick/runspin.sh b/CodeSamples/formal/promela/dyntick/runspin.sh
> similarity index 100%
> rename from CodeSamples/analysis/promela/dyntick/runspin.sh
> rename to CodeSamples/formal/promela/dyntick/runspin.sh
> diff --git a/CodeSamples/analysis/promela/increment.spin b/CodeSamples/formal/promela/increment.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/increment.spin
> rename to CodeSamples/formal/promela/increment.spin
> diff --git a/CodeSamples/analysis/promela/lock.h b/CodeSamples/formal/promela/lock.h
> similarity index 100%
> rename from CodeSamples/analysis/promela/lock.h
> rename to CodeSamples/formal/promela/lock.h
> diff --git a/CodeSamples/analysis/promela/lock.spin b/CodeSamples/formal/promela/lock.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/lock.spin
> rename to CodeSamples/formal/promela/lock.spin
> diff --git a/CodeSamples/analysis/promela/qrcu.spin b/CodeSamples/formal/promela/qrcu.spin
> similarity index 100%
> rename from CodeSamples/analysis/promela/qrcu.spin
> rename to CodeSamples/formal/promela/qrcu.spin
> -- 
> 2.10.0
> 
> --
> To unsubscribe from this list: send the line "unsubscribe perfbook" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


      parent reply	other threads:[~2016-09-27 23:19 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-27 21:56 [PATCH v3 01/17] formal: Rearrange promela sample code location SeongJae Park
2016-09-27 21:56 ` [PATCH v3 02/17] formal/spinhint: Add missing NBSPs SeongJae Park
2016-09-27 21:56 ` [PATCH v3 03/17] formal/spinhint: Fix typos SeongJae Park
2016-09-27 21:56 ` [PATCH v3 04/17] formal/spinhint: Use \path{} for file name quotation SeongJae Park
2016-09-27 21:56 ` [PATCH v3 05/17] formal/spinhint: Use \co{} for variable quotation consistently SeongJae Park
2016-09-27 21:56 ` [PATCH v3 06/17] formal/spinhint: Reference figure SeongJae Park
2016-09-27 21:56 ` [PATCH v3 07/17] formal/dyntickrcu: Add missing NBSPs SeongJae Park
2016-09-27 21:56 ` [PATCH v3 08/17] formal/dyntickrcu: Append `()` to function name quotations SeongJae Park
2016-09-27 21:56 ` [PATCH v3 09/17] formal/dyntickrcu: Fix typos SeongJae Park
2016-09-27 21:56 ` [PATCH v3 10/17] formal/dyntickrcu: Fix wrong line number quotation SeongJae Park
2016-09-27 21:56 ` [PATCH v3 11/17] formal/dyntickrcu: Fix wrong function name quotation SeongJae Park
2016-09-27 21:56 ` [PATCH v3 12/17] formal/ppcmem: Fix typo for \co{} SeongJae Park
2016-09-27 21:56 ` [PATCH v3 13/17] formal/ppcmem: Use \co{} for instruction quotation SeongJae Park
2016-09-27 21:56 ` [PATCH v3 14/17] formal/ppcmem: Use P0 instead of thread 1 SeongJae Park
2016-09-27 21:56 ` [PATCH v3 15/17] formal/ppcmem: Substitute `paper` with `chapter` SeongJae Park
2016-09-27 21:56 ` [PATCH v3 16/17] formal/ppcmem: Polish a sentence by removing unnecessary conjunction SeongJae Park
2016-09-27 21:56 ` [PATCH v3 17/17] formal/dyntickrcu: Adjust font size of sample code SeongJae Park
2016-09-27 23:19 ` Paul E. McKenney [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160927231904.GA11932@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akiyks@gmail.com \
    --cc=perfbook@vger.kernel.org \
    --cc=sj38.park@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.