diff mbox series

[v2,12/12] replay: assert time only goes forward

Message ID 20170405132503.32125-13-alex.bennee@linaro.org
State Superseded
Headers show
Series icount and misc MTTCG fixes for 2.9-rc4 | expand

Commit Message

Alex Bennée April 5, 2017, 1:25 p.m. UTC
If we find ourselves trying to add an event to the log where time has
gone backwards it is because a vCPU event has occurred and the
main-loop is not yet aware of time moving forward. This should not
happen and if it does its better to fail early than generate a log
that will have weird behaviour.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
 replay/replay-internal.c | 4 ++++
 replay/replay.c          | 4 ++++
 2 files changed, 8 insertions(+)

-- 
2.11.0

Comments

Pavel Dovgalyuk April 5, 2017, 1:33 p.m. UTC | #1
> From: Alex Bennée [mailto:alex.bennee@linaro.org]

> 

> If we find ourselves trying to add an event to the log where time has

> gone backwards it is because a vCPU event has occurred and the

> main-loop is not yet aware of time moving forward. This should not

> happen and if it does its better to fail early than generate a log

> that will have weird behaviour.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> ---

>  replay/replay-internal.c | 4 ++++

>  replay/replay.c          | 4 ++++

>  2 files changed, 8 insertions(+)

> 

> diff --git a/replay/replay-internal.c b/replay/replay-internal.c

> index bea7b4aa6b..fca8514012 100644

> --- a/replay/replay-internal.c

> +++ b/replay/replay-internal.c

> @@ -195,6 +195,10 @@ void replay_save_instructions(void)

>      if (replay_file && replay_mode == REPLAY_MODE_RECORD) {

>          replay_mutex_lock();

>          int diff = (int)(replay_get_current_step() - replay_state.current_step);

> +

> +        /* Time can only go forward */

> +        assert(diff >= 0);

> +

>          if (diff > 0) {


This "if" is useless then.

>              replay_put_event(EVENT_INSTRUCTION);

>              replay_put_dword(diff);

> diff --git a/replay/replay.c b/replay/replay.c

> index 9e0724e756..f810628cac 100644

> --- a/replay/replay.c

> +++ b/replay/replay.c

> @@ -84,6 +84,10 @@ void replay_account_executed_instructions(void)

>          if (replay_state.instructions_count > 0) {

>              int count = (int)(replay_get_current_step()

>                                - replay_state.current_step);

> +

> +            /* Time can only go forward */

> +            assert(count >= 0);

> +

>              replay_state.instructions_count -= count;

>              replay_state.current_step += count;

>              if (replay_state.instructions_count == 0) {

> --

> 2.11.0



Pavel Dovgalyuk
Paolo Bonzini April 5, 2017, 1:49 p.m. UTC | #2
On 05/04/2017 15:33, Pavel Dovgalyuk wrote:
>> +

>> +        /* Time can only go forward */

>> +        assert(diff >= 0);

>> +

>>          if (diff > 0) {

> This "if" is useless then.

> 


It isn't, "diff == 0" can happen.

Paolo
Alex Bennée April 5, 2017, 2:37 p.m. UTC | #3
Paolo Bonzini <pbonzini@redhat.com> writes:

> On 05/04/2017 15:33, Pavel Dovgalyuk wrote:

>>> +

>>> +        /* Time can only go forward */

>>> +        assert(diff >= 0);

>>> +

>>>          if (diff > 0) {

>> This "if" is useless then.

>>

>

> It isn't, "diff == 0" can happen.


In my previous patchset I actually output-ed a EVENT_INSTRUCTION with a
zero diff for the negative case although it does seem redundant to
output that if we can avoid it?

--
Alex Bennée
diff mbox series

Patch

diff --git a/replay/replay-internal.c b/replay/replay-internal.c
index bea7b4aa6b..fca8514012 100644
--- a/replay/replay-internal.c
+++ b/replay/replay-internal.c
@@ -195,6 +195,10 @@  void replay_save_instructions(void)
     if (replay_file && replay_mode == REPLAY_MODE_RECORD) {
         replay_mutex_lock();
         int diff = (int)(replay_get_current_step() - replay_state.current_step);
+
+        /* Time can only go forward */
+        assert(diff >= 0);
+
         if (diff > 0) {
             replay_put_event(EVENT_INSTRUCTION);
             replay_put_dword(diff);
diff --git a/replay/replay.c b/replay/replay.c
index 9e0724e756..f810628cac 100644
--- a/replay/replay.c
+++ b/replay/replay.c
@@ -84,6 +84,10 @@  void replay_account_executed_instructions(void)
         if (replay_state.instructions_count > 0) {
             int count = (int)(replay_get_current_step()
                               - replay_state.current_step);
+
+            /* Time can only go forward */
+            assert(count >= 0);
+
             replay_state.instructions_count -= count;
             replay_state.current_step += count;
             if (replay_state.instructions_count == 0) {