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
>
prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox