Re: [PATCH v3 01/17] formal: Rearrange promela sample code location

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>

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@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe perfbook" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux