Re: [PATCH v4 3/8] tpm_emulator: Implement callback for whether we are suspended
On 12/12/19 1:33 PM, Stefan Berger wrote: On 12/12/19 1:07 PM, Stefan Berger wrote: Implement the check whether the emulator backend is suspended. Signed-off-by: Stefan Berger diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c index 22f9113432..7be7d3a91b 100644 --- a/hw/tpm/tpm_emulator.c +++ b/hw/tpm/tpm_emulator.c @@ -80,6 +80,8 @@ typedef struct TPMEmulator { unsigned int established_flag_cached:1; TPMBlobBuffers state_blobs; + + bool is_suspended; } TPMEmulator; struct tpm_error { @@ -486,6 +488,13 @@ static size_t tpm_emulator_get_buffer_size(TPMBackend *tb) return actual_size; } +static bool tpm_emulator_is_suspended(TPMBackend *tb) +{ + TPMEmulator *tpm_emu = TPM_EMULATOR(tb); + + return tpm_emu->is_suspended; +} + static int tpm_emulator_block_migration(TPMEmulator *tpm_emu) { Error *err = NULL; @@ -846,6 +855,8 @@ static int tpm_emulator_pre_save(void *opaque) TPMBackend *tb = opaque; TPMEmulator *tpm_emu = TPM_EMULATOR(tb); + tpm_emu->is_suspended = true; This is the most critical part here. It must be true when we receive a response in the tpm_spapr_request_completed(). The problem is that what tpm_backend_finish_sync() does is not specific to this backend but more a global operation that another device could run as well -- none seem to do this today. So the point is that there could be a race here. This flag should really be set in '.pre_pre_save,' so before any other device could poll. Better would be calling a global function that indicates whether device suspension has started. In this case we could do away with this and just call that function from the spapr device. runstate_check(RUN_STATE_FINISH_MIGRATE) seems to be what we need here...
[PATCH v4 3/8] tpm_emulator: Implement callback for whether we are suspended
Implement the check whether the emulator backend is suspended. Signed-off-by: Stefan Berger diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c index 22f9113432..7be7d3a91b 100644 --- a/hw/tpm/tpm_emulator.c +++ b/hw/tpm/tpm_emulator.c @@ -80,6 +80,8 @@ typedef struct TPMEmulator { unsigned int established_flag_cached:1; TPMBlobBuffers state_blobs; + +bool is_suspended; } TPMEmulator; struct tpm_error { @@ -486,6 +488,13 @@ static size_t tpm_emulator_get_buffer_size(TPMBackend *tb) return actual_size; } +static bool tpm_emulator_is_suspended(TPMBackend *tb) +{ +TPMEmulator *tpm_emu = TPM_EMULATOR(tb); + +return tpm_emu->is_suspended; +} + static int tpm_emulator_block_migration(TPMEmulator *tpm_emu) { Error *err = NULL; @@ -846,6 +855,8 @@ static int tpm_emulator_pre_save(void *opaque) TPMBackend *tb = opaque; TPMEmulator *tpm_emu = TPM_EMULATOR(tb); +tpm_emu->is_suspended = true; + trace_tpm_emulator_pre_save(); tpm_backend_finish_sync(tb); @@ -975,6 +986,7 @@ static void tpm_emulator_class_init(ObjectClass *klass, void *data) tbc->get_tpm_version = tpm_emulator_get_tpm_version; tbc->get_buffer_size = tpm_emulator_get_buffer_size; tbc->get_tpm_options = tpm_emulator_get_tpm_options; +tbc->is_suspended = tpm_emulator_is_suspended; tbc->handle_request = tpm_emulator_handle_request; } -- 2.21.0
Re: [PATCH v4 3/8] tpm_emulator: Implement callback for whether we are suspended
On 12/12/19 1:07 PM, Stefan Berger wrote: Implement the check whether the emulator backend is suspended. Signed-off-by: Stefan Berger diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c index 22f9113432..7be7d3a91b 100644 --- a/hw/tpm/tpm_emulator.c +++ b/hw/tpm/tpm_emulator.c @@ -80,6 +80,8 @@ typedef struct TPMEmulator { unsigned int established_flag_cached:1; TPMBlobBuffers state_blobs; + +bool is_suspended; } TPMEmulator; struct tpm_error { @@ -486,6 +488,13 @@ static size_t tpm_emulator_get_buffer_size(TPMBackend *tb) return actual_size; } +static bool tpm_emulator_is_suspended(TPMBackend *tb) +{ +TPMEmulator *tpm_emu = TPM_EMULATOR(tb); + +return tpm_emu->is_suspended; +} + static int tpm_emulator_block_migration(TPMEmulator *tpm_emu) { Error *err = NULL; @@ -846,6 +855,8 @@ static int tpm_emulator_pre_save(void *opaque) TPMBackend *tb = opaque; TPMEmulator *tpm_emu = TPM_EMULATOR(tb); +tpm_emu->is_suspended = true; This is the most critical part here. It must be true when we receive a response in the tpm_spapr_request_completed(). The problem is that what tpm_backend_finish_sync() does is not specific to this backend but more a global operation that another device could run as well -- none seem to do this today. So the point is that there could be a race here. This flag should really be set in '.pre_pre_save,' so before any other device could poll. Better would be calling a global function that indicates whether device suspension has started. In this case we could do away with this and just call that function from the spapr device.