From nobody Tue Jul 25 06:50:59 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4R97380nFmz4p4C9; Tue, 25 Jul 2023 06:51:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4R973808wQz4QRq; Tue, 25 Jul 2023 06:51:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690267860; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=l7lGF49SZrZJbxTg/B24UDf0bgsIkLFFj4sFH04etRk=; b=jXO3Y7rbFtGcnw7Xp/dhxbJ34JfSqdAVWU324EwFtKcj8mKoHoB/nWtFwCgmPh8LjNBE65 KsJakl7b1ONX5twX2ieDqWfTCdJfx9imhf2u/mV+BbNgOF/JCLQyBiVWkAPIqmszL87XVN rU8lLdOscTa2l41KH5teMEZQR7GyVifOPwwLyS8strPEErJO1w2JD/WB2iVtLd02QVpu3s EmjSAOE+kQ+6zOVCTuYMSbNfoOvSAGYfUbTosXR/kHwOnLM2WREFtSRl9nMvlhDSyUzNBa fBj+VDOcRU3+6JTkxUk/3ZM0aGGMi0xG6bKVb9OcjcYl9zNBrlv/VEr7rpy6Yw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690267860; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=l7lGF49SZrZJbxTg/B24UDf0bgsIkLFFj4sFH04etRk=; b=QwG190iKoJ97SEwrdw6DZ2y46G8jTGq5ORVPIToIsW/Jw5wY/ZEZ5uh0Xmz6fnPd9fuC1z iYvx0/mMnV7s4PE0x/vkncLw/6Mtsh7ANyxlm69l++rn9Djdv8qqRrU0IPAfVutXImbxGg DSXDL73t4CjsRT1w5tSbBFRYdhZ0ZllyuT+u2I/nQfWnCFu0kFfPOclXVKjsckFgnPYkZa ivb2sCIjyez+KSMeqHLjlg8Gluz1/GeEJ7f61Hx7KbkKkqyZf72i7Uzu5chD21SsU/VshN 3WrfJr6amJCc74Rj2OR0m32PlloRib6BrexkHrjTDWdh/uw43CrUW2FhLpV0IA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1690267860; a=rsa-sha256; cv=none; b=vAAJbtuUciY+nOQjfOfJXUzy9QsBn4OpWPKdkftWQnm/rG1ZkeJDUAS1OZL2PcpLRNYlrm kwp9UIPjuqAV4pmXPA/BbmMGnGSL1Y0VA+Jk/FH7D40Kf6MNjzUGVEGkLnSAzJSi73mjME JyQm+0LbXwea/FlX6OE5KDUuNF11oxrOZn5uWc9KY5s/vnQt7w6MseUxzz274TM8KL7LLX vhz7ovkxgWCJKVndWG5i6NCQ8m0IxT9IIxVj3YhfSKXQCwwAwWgwB+coa2ApNyieTtjHe5 K02n8a69aRYfOcz4zCR4NcWjyRfbUnHtrFCDS39GQif60iF3f7ttKG2484GMng== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4R97376LnczqHK; Tue, 25 Jul 2023 06:50:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 36P6oxn0081413; Tue, 25 Jul 2023 06:50:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 36P6oxmu081412; Tue, 25 Jul 2023 06:50:59 GMT (envelope-from git) Date: Tue, 25 Jul 2023 06:50:59 GMT Message-Id: <202307250650.36P6oxmu081412@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Corvin=20K=C3=B6hne?= Subject: git: f0124ab11122 - main - bhyve: do not hold CRB mutex when executing TPM commands List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: corvink X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f0124ab11122c24166fe83ae6898f629721a7894 Auto-Submitted: auto-generated The branch main has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=f0124ab11122c24166fe83ae6898f629721a7894 commit f0124ab11122c24166fe83ae6898f629721a7894 Author: Corvin Köhne AuthorDate: 2023-06-23 06:31:38 +0000 Commit: Corvin Köhne CommitDate: 2023-07-25 06:50:23 +0000 bhyve: do not hold CRB mutex when executing TPM commands TPM commands can take up to several seconds to execute. If we hold the CRB mutex while executing the command, MMIO accesses could be blocked for a long time. Therefore, just copy all required values and work on the copied values. Reviewed by: markj MFC after: 1 week Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D40724 --- usr.sbin/bhyve/tpm_intf_crb.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/usr.sbin/bhyve/tpm_intf_crb.c b/usr.sbin/bhyve/tpm_intf_crb.c index a8e84f911c8d..c4bfaa19958d 100644 --- a/usr.sbin/bhyve/tpm_intf_crb.c +++ b/usr.sbin/bhyve/tpm_intf_crb.c @@ -184,6 +184,13 @@ tpm_crb_thread(void *const arg) pthread_mutex_lock(&crb->mutex); for (;;) { + /* + * We're releasing the lock after wake up. Therefore, we have to + * check the closing condition before and after going to sleep. + */ + if (crb->closing) + break; + pthread_cond_wait(&crb->cond, &crb->mutex); if (crb->closing) @@ -208,6 +215,16 @@ tpm_crb_thread(void *const arg) break; } + uint8_t cmd[TPM_CRB_DATA_BUFFER_SIZE]; + memcpy(cmd, crb->regs.data_buffer, TPM_CRB_DATA_BUFFER_SIZE); + + /* + * A TPM command can take multiple seconds to execute. As we've + * copied all required values and buffers at this point, we can + * release the mutex. + */ + pthread_mutex_unlock(&crb->mutex); + /* * The command response buffer interface uses a single buffer * for sending a command to and receiving a response from the @@ -221,10 +238,10 @@ tpm_crb_thread(void *const arg) * response. */ uint8_t rsp[TPM_CRB_DATA_BUFFER_SIZE] = { 0 }; - crb->emul->execute_cmd(crb->emul_sc, - &crb->regs.data_buffer[cmd_off], cmd_size, &rsp[rsp_off], - rsp_size); + crb->emul->execute_cmd(crb->emul_sc, &cmd[cmd_off], cmd_size, + &rsp[rsp_off], rsp_size); + pthread_mutex_lock(&crb->mutex); memset(crb->regs.data_buffer, 0, TPM_CRB_DATA_BUFFER_SIZE); memcpy(&crb->regs.data_buffer[rsp_off], &rsp[rsp_off], rsp_size);