diff options
author | Peter Maydell | 2018-01-30 16:20:01 +0100 |
---|---|---|
committer | Peter Maydell | 2018-01-30 16:20:01 +0100 |
commit | 6521130b0a7f699fdb82446d57df5627bfa7ed3c (patch) | |
tree | 4133f36786798486d7222df1dbcc9d1919708116 /backends | |
parent | linux-user/signal.c: Rename MC_* defines (diff) | |
parent | tpm: add CRB device (diff) | |
download | qemu-6521130b0a7f699fdb82446d57df5627bfa7ed3c.tar.gz qemu-6521130b0a7f699fdb82446d57df5627bfa7ed3c.tar.xz qemu-6521130b0a7f699fdb82446d57df5627bfa7ed3c.zip |
Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2018-01-26-2' into staging
Merge tpm 2018/01/26 v2
# gpg: Signature made Mon 29 Jan 2018 22:20:05 GMT
# gpg: using RSA key 0x75AD65802A0B4211
# gpg: Good signature from "Stefan Berger <stefanb@linux.vnet.ibm.com>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
# Primary key fingerprint: B818 B9CA DF90 89C2 D5CE C66B 75AD 6580 2A0B 4211
* remotes/stefanberger/tags/pull-tpm-2018-01-26-2:
tpm: add CRB device
tpm: report backend request error
tpm: replace GThreadPool with AIO threadpool
tpm: lookup cancel path under tpm device class
tpm: fix alignment issues
tpm: Set the flags of the CMD_INIT command to 0
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'backends')
-rw-r--r-- | backends/tpm.c | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/backends/tpm.c b/backends/tpm.c index 91222c5164..d617ba7c52 100644 --- a/backends/tpm.c +++ b/backends/tpm.c @@ -19,30 +19,40 @@ #include "sysemu/tpm.h" #include "qemu/thread.h" #include "qemu/main-loop.h" +#include "block/thread-pool.h" +#include "qemu/error-report.h" -static void tpm_backend_request_completed_bh(void *opaque) +static void tpm_backend_request_completed(void *opaque, int ret) { TPMBackend *s = TPM_BACKEND(opaque); TPMIfClass *tic = TPM_IF_GET_CLASS(s->tpmif); - tic->request_completed(s->tpmif); + tic->request_completed(s->tpmif, ret); + + /* no need for atomic, as long the BQL is taken */ + s->cmd = NULL; + object_unref(OBJECT(s)); } -static void tpm_backend_worker_thread(gpointer data, gpointer user_data) +static int tpm_backend_worker_thread(gpointer data) { - TPMBackend *s = TPM_BACKEND(user_data); + TPMBackend *s = TPM_BACKEND(data); TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s); + Error *err = NULL; - k->handle_request(s, (TPMBackendCmd *)data); + k->handle_request(s, s->cmd, &err); + if (err) { + error_report_err(err); + return -1; + } - qemu_bh_schedule(s->bh); + return 0; } -static void tpm_backend_thread_end(TPMBackend *s) +void tpm_backend_finish_sync(TPMBackend *s) { - if (s->thread_pool) { - g_thread_pool_free(s->thread_pool, FALSE, TRUE); - s->thread_pool = NULL; + while (s->cmd) { + aio_poll(qemu_get_aio_context(), true); } } @@ -74,10 +84,7 @@ int tpm_backend_startup_tpm(TPMBackend *s, size_t buffersize) TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s); /* terminate a running TPM */ - tpm_backend_thread_end(s); - - s->thread_pool = g_thread_pool_new(tpm_backend_worker_thread, s, 1, TRUE, - NULL); + tpm_backend_finish_sync(s); res = k->startup_tpm ? k->startup_tpm(s, buffersize) : 0; @@ -93,7 +100,17 @@ bool tpm_backend_had_startup_error(TPMBackend *s) void tpm_backend_deliver_request(TPMBackend *s, TPMBackendCmd *cmd) { - g_thread_pool_push(s->thread_pool, cmd, NULL); + ThreadPool *pool = aio_get_thread_pool(qemu_get_aio_context()); + + if (s->cmd != NULL) { + error_report("There is a TPM request pending"); + return; + } + + s->cmd = cmd; + object_ref(OBJECT(s)); + thread_pool_submit_aio(pool, tpm_backend_worker_thread, s, + tpm_backend_request_completed, s); } void tpm_backend_reset(TPMBackend *s) @@ -104,7 +121,7 @@ void tpm_backend_reset(TPMBackend *s) k->reset(s); } - tpm_backend_thread_end(s); + tpm_backend_finish_sync(s); s->had_startup_error = false; } @@ -159,28 +176,18 @@ TPMInfo *tpm_backend_query_tpm(TPMBackend *s) return info; } -static void tpm_backend_instance_init(Object *obj) -{ - TPMBackend *s = TPM_BACKEND(obj); - - s->bh = qemu_bh_new(tpm_backend_request_completed_bh, s); -} - static void tpm_backend_instance_finalize(Object *obj) { TPMBackend *s = TPM_BACKEND(obj); object_unref(OBJECT(s->tpmif)); g_free(s->id); - tpm_backend_thread_end(s); - qemu_bh_delete(s->bh); } static const TypeInfo tpm_backend_info = { .name = TYPE_TPM_BACKEND, .parent = TYPE_OBJECT, .instance_size = sizeof(TPMBackend), - .instance_init = tpm_backend_instance_init, .instance_finalize = tpm_backend_instance_finalize, .class_size = sizeof(TPMBackendClass), .abstract = true, |