From patchwork Fri May 5 17:30:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 90520 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp577148vqo; Fri, 5 May 2023 10:33:29 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4W6Q0cUoawTb2RWoQ6zdJWcXJTmqi4pGrf/eLeAb8if8sqY5Czt8qalVcwEuHSN/Ya+rNw X-Received: by 2002:a05:6a21:6710:b0:f3:3578:6699 with SMTP id wh16-20020a056a21671000b000f335786699mr2460390pzb.45.1683308009069; Fri, 05 May 2023 10:33:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683308009; cv=none; d=google.com; s=arc-20160816; b=ofvk5RixmzRJ2BOxIGuoL76fs9+3K8d1Tppt5A52sSR+kmsWitxSI2602dvsp+06OJ n6iicDuH+VTSAbp63BRkmaSPF3w9Ye98r7RhOrrNb9LHSwmNUQtedxdLAFATsjorZRRZ LQE9mvgC9NDmjwZ/+bYlL0uqHTBmJ4SIYWwgSW07IuYdAByMRDZXQsZNwcB2CY7yhMqc C9orvni88HcMFEYUCFAjJsFyu0QH9wpgLV+UxKlDfE/gSgEPQAu8j/Y/tjSK+7oe7d/i TuA3qJmvqHfj9C9J7FVcwPVuqC923EoVgzr1OH7UGFlzp5+KYE8UtEwoAmkHeq7H4FJY hX5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=jfUukF2i6vd0+ioFWgl7YqhMrlegquDIzdsi1Oy+Kus=; b=RpjfJhevIhXA9JQqy8aLs51QpPEDZ34w/fHrp8YzToDrDZrf8ayVIXC8BeqL+Z4wb7 1iHESLzLvh5rORm5mm2M9nuiiMufMamOTyHDcWOzBuLKSn4lyad1aIEzwbpoa0DSCUm4 qPT+1xJTIHcCA6dRZyhTSyjewX5ATP91jryKcnuAAjvjfMIf1RptJmhF/hqLFgrnuz7w 7zuY3KYLlnpdRo9Ovk1IlAclfYjhEs1zcSxVAhQqLuIuHqy4OyYY3D0Jkx9lr05Or8Zh b7fmoLxlkHkHuVWLFT5EUyBI811zK0R2eIrG+YACZDq1CFFMT2/29OsIvaVQ/k9SmcJQ OIHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ppdAqQx6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e11-20020a17090a728b00b0023418ec51f8si6860409pjg.136.2023.05.05.10.33.15; Fri, 05 May 2023 10:33:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ppdAqQx6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232624AbjEERbU (ORCPT + 99 others); Fri, 5 May 2023 13:31:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232137AbjEERbP (ORCPT ); Fri, 5 May 2023 13:31:15 -0400 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC48A17FDB for ; Fri, 5 May 2023 10:31:12 -0700 (PDT) Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-305f0491e62so1971739f8f.3 for ; Fri, 05 May 2023 10:31:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1683307871; x=1685899871; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=jfUukF2i6vd0+ioFWgl7YqhMrlegquDIzdsi1Oy+Kus=; b=ppdAqQx69nxjh8O8E3OAleM+UqCo3/ry/CeBOw1IF6Q5syIVXIcDMkwhD34rNJaDIZ I9QARsx3ReKaCtQAWPaH+tOrOrRPWLjorjdKgfl2XdcFzGqPQH4y+VskSlq7tAhCsch3 x5gYD16k5lBfCJfXVDfhTSfQ/KZT5iOssQGuH8zjqC/nX6vLDju4qBTRrYXI2WGJnLcg zGCV0cbfPNzyKEJByXo4km4Iim79cfuWQX9uCi00FfRmdZIj1HBgwG2pToTp19PZXZEh 3+XFXXGQFDuzU8YsRSJ86luV3ce6zEwptnFXIUEd4b9WFoU9EZQ0i/DMmFGNEKW1vzqo ZBHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683307871; x=1685899871; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jfUukF2i6vd0+ioFWgl7YqhMrlegquDIzdsi1Oy+Kus=; b=QERmfBzV8o2Skpk2vcL0D8LshvP6+/PkrE5eZIkIiXK1UukOlrZMEpINP+hA4J/9fZ SZlGYOsmTee3GdtN3N+AAmbU0eowdjASmcPC/FQzOGzTWgbTlLSB0ruKKR/nVQJletD6 Kl6iVK9dczfn2O2GV5F9JWW8jWkxBwj6DV2q3ckUOPB1MNIryKMmYyDsQOE9JZXfdEyW 4Y0d3Sq6/Hl61PLfWZcMS1HjQAo4WJuZVGoSvX49k3jDP94bDU1sHOjFeIZAYjJKen1g BSI38mOOcMyyyMdq0XO04xUWwn+U2pEN+05K9G5L02PupQEEfQ35EExDKBpTd3JUWnEM 3X+w== X-Gm-Message-State: AC+VfDyJfk6DN4+gvv5u5LNO3qEXyMn7+u/7A/5rENkAh56RzffEbyqP sI0tST8N4liTDKZq6CQTRHOyV/u3jHLUyRHAPXo= X-Received: by 2002:adf:f3c9:0:b0:306:3319:e432 with SMTP id g9-20020adff3c9000000b003063319e432mr2044697wrp.18.1683307870736; Fri, 05 May 2023 10:31:10 -0700 (PDT) Received: from lmecxl1178.lme.st.com (lfbn-nan-1-1169-52.w86-212.abo.wanadoo.fr. [86.212.112.52]) by smtp.gmail.com with ESMTPSA id a15-20020adff7cf000000b002f6176cc6desm2971170wrq.110.2023.05.05.10.31.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 May 2023 10:31:10 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v6 1/4] tee: optee: system call property Date: Fri, 5 May 2023 19:30:09 +0200 Message-Id: <20230505173012.881083-1-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1765076379187482202?= X-GMAIL-MSGID: =?utf-8?q?1765076379187482202?= Adds an argument to do_call_with_arg() handler to tell whether the call is a system call or nor. This change always sets this info to false hence no functional change. This change prepares management of system invocation proposed in a later change. Co-developed-by: Jens Wiklander Signed-off-by: Jens Wiklander Signed-off-by: Etienne Carriere --- No changes since v5 Changes since v4: - New change, extracted from PATCH v4 1/2 (tee: system invocation") and revised to cover preparatory changes in optee driver for system session support with contribution from Jens. --- drivers/tee/optee/call.c | 22 ++++++++++++++++------ drivers/tee/optee/core.c | 5 +++-- drivers/tee/optee/ffa_abi.c | 3 ++- drivers/tee/optee/optee_private.h | 7 +++++-- drivers/tee/optee/smc_abi.c | 9 +++++---- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index df5fb5410b72..dba5339b61ae 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -328,7 +328,8 @@ int optee_open_session(struct tee_context *ctx, goto out; } - if (optee->ops->do_call_with_arg(ctx, shm, offs)) { + if (optee->ops->do_call_with_arg(ctx, shm, offs, + sess->use_sys_thread)) { msg_arg->ret = TEEC_ERROR_COMMUNICATION; msg_arg->ret_origin = TEEC_ORIGIN_COMMS; } @@ -360,7 +361,8 @@ int optee_open_session(struct tee_context *ctx, return rc; } -int optee_close_session_helper(struct tee_context *ctx, u32 session) +int optee_close_session_helper(struct tee_context *ctx, u32 session, + bool system_thread) { struct optee *optee = tee_get_drvdata(ctx->teedev); struct optee_shm_arg_entry *entry; @@ -374,7 +376,7 @@ int optee_close_session_helper(struct tee_context *ctx, u32 session) msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION; msg_arg->session = session; - optee->ops->do_call_with_arg(ctx, shm, offs); + optee->ops->do_call_with_arg(ctx, shm, offs, system_thread); optee_free_msg_arg(ctx, entry, offs); @@ -385,6 +387,7 @@ int optee_close_session(struct tee_context *ctx, u32 session) { struct optee_context_data *ctxdata = ctx->data; struct optee_session *sess; + bool system_thread; /* Check that the session is valid and remove it from the list */ mutex_lock(&ctxdata->mutex); @@ -394,9 +397,10 @@ int optee_close_session(struct tee_context *ctx, u32 session) mutex_unlock(&ctxdata->mutex); if (!sess) return -EINVAL; + system_thread = sess->use_sys_thread; kfree(sess); - return optee_close_session_helper(ctx, session); + return optee_close_session_helper(ctx, session, system_thread); } int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, @@ -408,12 +412,15 @@ int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct optee_msg_arg *msg_arg; struct optee_session *sess; struct tee_shm *shm; + bool system_thread; u_int offs; int rc; /* Check that the session is valid */ mutex_lock(&ctxdata->mutex); sess = find_session(ctxdata, arg->session); + if (sess) + system_thread = sess->use_sys_thread; mutex_unlock(&ctxdata->mutex); if (!sess) return -EINVAL; @@ -432,7 +439,7 @@ int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, if (rc) goto out; - if (optee->ops->do_call_with_arg(ctx, shm, offs)) { + if (optee->ops->do_call_with_arg(ctx, shm, offs, system_thread)) { msg_arg->ret = TEEC_ERROR_COMMUNICATION; msg_arg->ret_origin = TEEC_ORIGIN_COMMS; } @@ -457,12 +464,15 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session) struct optee_shm_arg_entry *entry; struct optee_msg_arg *msg_arg; struct optee_session *sess; + bool system_thread; struct tee_shm *shm; u_int offs; /* Check that the session is valid */ mutex_lock(&ctxdata->mutex); sess = find_session(ctxdata, session); + if (sess) + system_thread = sess->use_sys_thread; mutex_unlock(&ctxdata->mutex); if (!sess) return -EINVAL; @@ -474,7 +484,7 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session) msg_arg->cmd = OPTEE_MSG_CMD_CANCEL; msg_arg->session = session; msg_arg->cancel_id = cancel_id; - optee->ops->do_call_with_arg(ctx, shm, offs); + optee->ops->do_call_with_arg(ctx, shm, offs, system_thread); optee_free_msg_arg(ctx, entry, offs); return 0; diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 2a258bd3b6b5..d01ca47f7bde 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -129,7 +129,8 @@ int optee_open(struct tee_context *ctx, bool cap_memref_null) static void optee_release_helper(struct tee_context *ctx, int (*close_session)(struct tee_context *ctx, - u32 session)) + u32 session, + bool system_thread)) { struct optee_context_data *ctxdata = ctx->data; struct optee_session *sess; @@ -141,7 +142,7 @@ static void optee_release_helper(struct tee_context *ctx, list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list, list_node) { list_del(&sess->list_node); - close_session(ctx, sess->session_id); + close_session(ctx, sess->session_id, sess->use_sys_thread); kfree(sess); } kfree(ctxdata); diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 0828240f27e6..52cec9d06041 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -612,7 +612,8 @@ static int optee_ffa_yielding_call(struct tee_context *ctx, */ static int optee_ffa_do_call_with_arg(struct tee_context *ctx, - struct tee_shm *shm, u_int offs) + struct tee_shm *shm, u_int offs, + bool system_thread) { struct ffa_send_direct_data data = { .data0 = OPTEE_FFA_YIELDING_CALL_WITH_ARG, diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index 72685ee0d53f..3da7960ab34a 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -154,7 +154,8 @@ struct optee; */ struct optee_ops { int (*do_call_with_arg)(struct tee_context *ctx, - struct tee_shm *shm_arg, u_int offs); + struct tee_shm *shm_arg, u_int offs, + bool system_thread); int (*to_msg_param)(struct optee *optee, struct optee_msg_param *msg_params, size_t num_params, const struct tee_param *params); @@ -204,6 +205,7 @@ struct optee { struct optee_session { struct list_head list_node; u32 session_id; + bool use_sys_thread; }; struct optee_context_data { @@ -252,7 +254,8 @@ int optee_supp_send(struct tee_context *ctx, u32 ret, u32 num_params, int optee_open_session(struct tee_context *ctx, struct tee_ioctl_open_session_arg *arg, struct tee_param *param); -int optee_close_session_helper(struct tee_context *ctx, u32 session); +int optee_close_session_helper(struct tee_context *ctx, u32 session, + bool system_thread); int optee_close_session(struct tee_context *ctx, u32 session); int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct tee_param *param); diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index 49702cb08f4f..56ebbb96ac97 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -507,7 +507,7 @@ static int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, msg_arg->params->u.tmem.buf_ptr = virt_to_phys(pages_list) | (tee_shm_get_page_offset(shm) & (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); - if (optee->ops->do_call_with_arg(ctx, shm_arg, 0) || + if (optee->ops->do_call_with_arg(ctx, shm_arg, 0, false) || msg_arg->ret != TEEC_SUCCESS) rc = -EINVAL; @@ -550,7 +550,7 @@ static int optee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm) msg_arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; msg_arg->params[0].u.rmem.shm_ref = (unsigned long)shm; - if (optee->ops->do_call_with_arg(ctx, shm_arg, 0) || + if (optee->ops->do_call_with_arg(ctx, shm_arg, 0, false) || msg_arg->ret != TEEC_SUCCESS) rc = -EINVAL; out: @@ -885,7 +885,8 @@ static void optee_handle_rpc(struct tee_context *ctx, * Returns return code from secure world, 0 is OK */ static int optee_smc_do_call_with_arg(struct tee_context *ctx, - struct tee_shm *shm, u_int offs) + struct tee_shm *shm, u_int offs, + bool system_thread) { struct optee *optee = tee_get_drvdata(ctx->teedev); struct optee_call_waiter w; @@ -977,7 +978,7 @@ static int simple_call_with_arg(struct tee_context *ctx, u32 cmd) return PTR_ERR(msg_arg); msg_arg->cmd = cmd; - optee_smc_do_call_with_arg(ctx, shm, offs); + optee_smc_do_call_with_arg(ctx, shm, offs, false); optee_free_msg_arg(ctx, entry, offs); return 0; From patchwork Fri May 5 17:30:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 90521 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp579222vqo; Fri, 5 May 2023 10:37:16 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7EQtna3t8qIKDt9S62P2VYdDa3+s46Mf2FOV2MRPtprp0yA9/Xs3jCX+OtIEbVlkcWkNyD X-Received: by 2002:a17:90a:6b4e:b0:24e:4dad:d8ab with SMTP id x14-20020a17090a6b4e00b0024e4dadd8abmr2471551pjl.0.1683308236597; Fri, 05 May 2023 10:37:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683308236; cv=none; d=google.com; s=arc-20160816; b=e2cXBTiT/Rr2ud1Nzq425+H4DfFLeSpOqYXa8bzSgYSFhmw1BIwOOURYadVwABiWwH kbGO9kBqe71nvPHD9HQ9V+4Kaqh19FeKRs6EBCPM+OUeE5himuESNdU8J81kTvYfU044 otkhI5SxBZen+Zgwtdq4op+cFVHFwCph/TSY/JPLHPvnLavIyHE6cRAdIYuwQsAIqYGr kkzZO3BmAB1xQ50ElRPyjmfMlAZwDp1dZVs4eoq3HO7RlDRej0rR3QUkoN/pX0dOziX/ 6wtfHR66rEgJmjS1qfh7paa4IFvXWzd1xPhu418ytJPAzmC+/JrqL2sH7+7kzaHnvw23 W9Tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ri6iJ92LeYdJs5/THZ1fw9VQsDiZwy6weBjtBqhDElM=; b=j/LecWiBzOc0iTFJOiD98Gm1hht4tMXgiYWZ3+QfYH2kHcgfPBwmDBisGCXWvBM9ju H7EXSJcv+80S6szrL1pLwwhPHTfB2Id+Bhs+0Op+ewRgEif6rmR9buvjSuA5zLQpMn9O 58hFrX5bSc294ZdAgmmWqi+RISSY/dFcIuGw1OI/LVM9LBcACwLa2Bt2YEUbtMlUkZ3k FUyrtqlSoawUM4mVrA4xVAfgOR2qAE/FCE1XFLQdKFKbqoyC51ysqF7jlqVh3dkmUb8t M22Ro+FN633ZrCUWYCE+Y/xAZL1DcFfEMPis81W8Clp3GoK9SWxBSrw+tuwYYlNUFqTl 8WrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="e/Fk8gPM"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t13-20020a17090ad50d00b0024dfab55f54si6786093pju.79.2023.05.05.10.37.02; Fri, 05 May 2023 10:37:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="e/Fk8gPM"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232583AbjEERbY (ORCPT + 99 others); Fri, 5 May 2023 13:31:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232160AbjEERbP (ORCPT ); Fri, 5 May 2023 13:31:15 -0400 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BA8471A1C3 for ; Fri, 5 May 2023 10:31:13 -0700 (PDT) Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-3f37a36b713so21034345e9.1 for ; Fri, 05 May 2023 10:31:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1683307872; x=1685899872; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ri6iJ92LeYdJs5/THZ1fw9VQsDiZwy6weBjtBqhDElM=; b=e/Fk8gPMbcB+MxQMeKYVPMRCTUJ/WOxY72GCP84IThARcITx3T1oUCJ6Vf1Q/D5mGi AW+c795Dti3cZDb6qsWk9SzgK5HZWnkEJgh3y3uq9GGaDNw23drxXreJjlD4/20O4KbK QKXVSNWuy1MaC9k47ERw+18ZQ/8fD3BStpSH0Dsxr/MMPDpduFAB8Bp9HsLHhNd/Hkzs VnJbLoMFgA3/lsTVHzc6LmFmtuJKjeYn9K1Tb7M9jloKZ+R8gkES9PUZRC2TAlo3OAIl gXjDmZ0rSvCOF4nH39LYiC5ktlnWCe4jTZrRPe1jkfunsia9ZQ7aqePGiMSDb8WCNgQ2 pYBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683307872; x=1685899872; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ri6iJ92LeYdJs5/THZ1fw9VQsDiZwy6weBjtBqhDElM=; b=SOC8Sn8HTu8FUbgenastyZnR6xaHcp82pOhJDnWb9FQDywF2Til9SkBuDedglyrc+2 gPfV/WceDTn8Qm9Guv03v2gF+n49l0ymfI1p9H00hzLPzSdZshIm+sGcZNCFJsUnH/G9 7w+PjPZwcubqetqmlQWYDKWhcAwvYH71/6PXTTOYunwxaUSfcTbz9xJoeR0T3ci2JMmZ vFpFigdTByvpFazXCaLGiRWdjNMv3NZdzRlWcE2LzWivRf+KCee1K2HjIRn+bX6NJieA d5FfHQHBpmtpbf2Y7/T1cZgjobir5rKrVm6bpkBKkHJr5SkYyYKkCV2M8vL/PsownxIg NmBQ== X-Gm-Message-State: AC+VfDxWP3UlNQML0B59qSXcyVKdchu5L5qsIc4KaLzLRkrwfPcCXOGp Y2x6EN6T26HuKkcMU5dmD31y7dHp1IqFE1i4nWQ= X-Received: by 2002:adf:f790:0:b0:2f2:7a0e:5cc9 with SMTP id q16-20020adff790000000b002f27a0e5cc9mr1771748wrp.19.1683307871844; Fri, 05 May 2023 10:31:11 -0700 (PDT) Received: from lmecxl1178.lme.st.com (lfbn-nan-1-1169-52.w86-212.abo.wanadoo.fr. [86.212.112.52]) by smtp.gmail.com with ESMTPSA id a15-20020adff7cf000000b002f6176cc6desm2971170wrq.110.2023.05.05.10.31.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 May 2023 10:31:11 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v6 2/4] tee: system session Date: Fri, 5 May 2023 19:30:10 +0200 Message-Id: <20230505173012.881083-2-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230505173012.881083-1-etienne.carriere@linaro.org> References: <20230505173012.881083-1-etienne.carriere@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1765076617256648739?= X-GMAIL-MSGID: =?utf-8?q?1765076617256648739?= Adds kernel client API function tee_client_system_session() for a client to request a system service entry in TEE context. This feature is needed to prevent a system deadlock when several TEE client applications invoke TEE, consuming all TEE thread contexts available in the secure world. The deadlock can happen in the OP-TEE driver for example if all these TEE threads issue an RPC call from TEE to Linux OS to access an eMMC RPMB partition (TEE secure storage) which device clock or regulator controller is accessed through an OP-TEE SCMI services. In that case, Linux SCMI driver must reach OP-TEE SCMI service without waiting one of the consumed TEE thread is freed. Co-developed-by: Jens Wiklander Signed-off-by: Jens Wiklander Signed-off-by: Etienne Carriere Reviewed-by: Sumit Garg --- No change since v5 Changes since v4: - Changes extracted from "[PATCH v4 1/2] tee: system invocation" and revised with Jens contribution to cover only definition of tee driver new API function tee_client_system_session() for kernel clients to register their session as a system session. - Commit message rephrased, including header line changed from "tee: system invocation" to "tee: system session" has the feature relates to system attributes of tee sessions. Changes since v3: - Fixed new SMC funcIDs to reserved/unreserve OP-TEE thread contexts: minor renaming + define as fastcall funcIDs. - Moved system_ctx_count from generic struct tee_context to optee's private struct optee_context_data. This changes optee smc_abi.c to release reserved thread contexts when the optee device is released. - Fixed inline description comments. No change since v2 Change since v1 - Addressed comment on Linux client to claim reservation on TEE context. This brings 2 new operations from client to TEE to request and release system thread contexts: 2 new tee_drv.h API functions, 2 new ops functions in struct tee_driver_ops. The OP-TEE implement shall implement 2 new fastcall SMC funcIDs. - Fixed typos in commit message. --- drivers/tee/tee_core.c | 8 ++++++++ include/linux/tee_drv.h | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index 0eb342de0b00..91932835d0f7 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -1170,6 +1170,14 @@ int tee_client_close_session(struct tee_context *ctx, u32 session) } EXPORT_SYMBOL_GPL(tee_client_close_session); +int tee_client_system_session(struct tee_context *ctx, u32 session) +{ + if (!ctx->teedev->desc->ops->system_session) + return -EINVAL; + return ctx->teedev->desc->ops->system_session(ctx, session); +} +EXPORT_SYMBOL_GPL(tee_client_system_session); + int tee_client_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct tee_param *param) diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index 17eb1c5205d3..911ddf92dcee 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -84,6 +84,7 @@ struct tee_param { * @release: release this open file * @open_session: open a new session * @close_session: close a session + * @system_session: declare session as a system session * @invoke_func: invoke a trusted function * @cancel_req: request cancel of an ongoing invoke or open * @supp_recv: called for supplicant to get a command @@ -100,6 +101,7 @@ struct tee_driver_ops { struct tee_ioctl_open_session_arg *arg, struct tee_param *param); int (*close_session)(struct tee_context *ctx, u32 session); + int (*system_session)(struct tee_context *ctx, u32 session); int (*invoke_func)(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct tee_param *param); @@ -429,6 +431,20 @@ int tee_client_open_session(struct tee_context *ctx, */ int tee_client_close_session(struct tee_context *ctx, u32 session); +/** + * tee_client_system_session() - Declare session as a system session + * @ctx: TEE Context + * @session: Session id + * + * This function requests TEE to provision an entry context ready to use for + * that session only. The provisioned entry context is used for command + * invocation and session closure, not for command cancelling requests. + * TEE releases the provisioned context upon session closure. + * + * Return < 0 on error else 0 if an entry context has been provisioned. + */ +int tee_client_system_session(struct tee_context *ctx, u32 session); + /** * tee_client_invoke_func() - Invoke a function in a Trusted Application * @ctx: TEE Context From patchwork Fri May 5 17:30:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 90522 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp579224vqo; Fri, 5 May 2023 10:37:16 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4QueD5CjGmatNAP3L+W1chhMsZWUDJ8a+EcFMbIz1e7PSNdtrJo5IJlws7VhGTDrXuN14e X-Received: by 2002:a05:6a20:8f27:b0:f2:b6d6:e3fa with SMTP id b39-20020a056a208f2700b000f2b6d6e3famr2940424pzk.38.1683308236597; Fri, 05 May 2023 10:37:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683308236; cv=none; d=google.com; s=arc-20160816; b=P049K90/YNfbQ5HZMjr/DhE7BeFdi23BsuuuYMprhhgW1tEX9XSlvtI3PVpT2aW27e /s8vunAo9Bsncf6uBF5wFvxjnzYIqWJ5o6TnODqOKT09TWk7aY2P+30XaWIHUwAFpJ+J COThLYjsWdNFxP8V8gtcnTILssb9DNpqmXIqaAuSvE9GMcgs7R4KGNLPPh/nuAKykWSu 2tkm95ihodToxkElj6nhwQ+cFth70PRy4R4nnYBa05WNwD/O7Cu5DazwK5mAl/G0jKLA lqN6Fkhm/VUyp+YQVdAN98Gw8/BbNseCTc9g89eizV+sjL1WHqvfWvSlJQJem50uGpkD HKCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=rcOB8l4Yjaf5YTC0O0tIL+rioux3JviGfDHhDIx9LOE=; b=Fl9KHRhAotouNArvTSh17Fs2zJHOYK3ObS2149RWqmY48Aiu5QXgvg+D84/MNdPsyz tF/eOy8TZUlclQFnKUOty+dpzRTiRxAcYdO1yWvp14I9iG3tVp41UvQJjo1Df2SdJtV1 fdr96zQUCvNPiFPFVOh73t++fRaRJIosPIApngfKh/EtoTibyglCGKcbY3X37VyTzQUJ SUBArJIaEvX1WwMFiBjxa5GNmeo/lkgBNZ10yjasSFnTPe909RuxI8c1ljx1Emms8ATH QU7R7sORopc/fy/CLU+cBWY9bHqGqrlfyHJDWfhW7BEUA3fmzhoECeLDPAPv8X5Op3YI j+pw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=SdRATaPZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x17-20020a656ab1000000b005030859019fsi2398143pgu.675.2023.05.05.10.37.02; Fri, 05 May 2023 10:37:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=SdRATaPZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231922AbjEERb2 (ORCPT + 99 others); Fri, 5 May 2023 13:31:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232168AbjEERbQ (ORCPT ); Fri, 5 May 2023 13:31:16 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8C9E21A1DB for ; Fri, 5 May 2023 10:31:14 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-3f1738d0d4cso13923765e9.1 for ; Fri, 05 May 2023 10:31:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1683307873; x=1685899873; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rcOB8l4Yjaf5YTC0O0tIL+rioux3JviGfDHhDIx9LOE=; b=SdRATaPZaaE/8vsX0kr/0kApUE28IZipFTUIcx0Smc7rwAS+UrsdG9J7nk/rnJoDBb PDVTF3bWhuFrIOrk7yQtQUGkSYvYWb4L4KHk1XQU1/YkIGwWrhJKa6bj4wuwExvlLG8A DzZIb73IEbtsEn68OozVMHi5X4ePlTo8UVeMegkjZh4JYsFJgf4UpLAsVNO6iNh5s/Yj Qmsd6DDgHABQKRpRSjL8sbRSHUfYrPDEs6jdoXYpxlvFRpOmb4WOMbAy+PrNKzHLy3VD TzbkIK3rNGiInU9tfiqkyJdC9C7RdZBP6ZWQDMWESJ4+v24HGZNqzB0IjyFTPkzz+Wey IZmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683307873; x=1685899873; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rcOB8l4Yjaf5YTC0O0tIL+rioux3JviGfDHhDIx9LOE=; b=kR8Yz8NmJIa3A+6EAWy1VIrPdHYnGAkqjHZyr4m6B6KrMsyir0go+EN8QbipoDV6Px cbwX7CBwWT77lz4WgnhqNvQaGHsA6mzX4OCl1yYSmgNGGWNCc3XVD8dQJ83soy2hzDWN 6OjgJ5y5kbiS/eZ9LkaQYBN3OSvWf+BuPTg2vydTayUVWvAHDVLGbx1Ud2p9BruI3ecb wsBomGahMJvpJv6ZtFUfnga7fwyy9FEOEKTQtXMVGGWXJAQw6avJZDKJy8eLfrLlT2HJ YYmCDlDo9ffH8aDQG4U6PQ5s+Ajqr/N4hPgwE30d0L3KrRMI1hFuXiWV75MXHBLYTsQZ aj/w== X-Gm-Message-State: AC+VfDwDMZ6TZA9V4PdY6Xz5p9t8WZ7n0I7kHcYHwAchEpDYC2dftx8Q HibEeLzTVt3VTq5+cRZCXs3YnoZU5M0ctuckzyE= X-Received: by 2002:adf:ff84:0:b0:306:2aa0:ce81 with SMTP id j4-20020adfff84000000b003062aa0ce81mr1943123wrr.30.1683307872776; Fri, 05 May 2023 10:31:12 -0700 (PDT) Received: from lmecxl1178.lme.st.com (lfbn-nan-1-1169-52.w86-212.abo.wanadoo.fr. [86.212.112.52]) by smtp.gmail.com with ESMTPSA id a15-20020adff7cf000000b002f6176cc6desm2971170wrq.110.2023.05.05.10.31.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 May 2023 10:31:12 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v6 3/4] tee: optee: support tracking system threads Date: Fri, 5 May 2023 19:30:11 +0200 Message-Id: <20230505173012.881083-3-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230505173012.881083-1-etienne.carriere@linaro.org> References: <20230505173012.881083-1-etienne.carriere@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1765076617685180122?= X-GMAIL-MSGID: =?utf-8?q?1765076617685180122?= From: Jens Wiklander Adds support in the OP-TEE driver to keep track of reserved system threads. The optee_cq_*() functions are updated to handle this if enabled. The SMC ABI part of the driver enables this tracking, but the FF-A ABI part does not. Signed-off-by: Jens Wiklander Signed-off-by: Etienne Carriere --- No change since v5 Changes since v4: - New change that supersedes implementation proposed in PATCH v4 (tee: system invocation"). Thanks to Jens implementation we don't need the new OP-TEE services that my previous patch versions introduced to monitor system threads entry. Now, Linux optee SMC ABI driver gets TEE provisioned thread contexts count once and monitors thread entries in OP-TEE on that basis and the system thread capability of the related tee session. By the way, I dropped the WARN_ONCE() call I suggested on tee thread exhaustion as it does not provides useful information. --- drivers/tee/optee/call.c | 128 +++++++++++++++++++++++++++--- drivers/tee/optee/ffa_abi.c | 10 +-- drivers/tee/optee/optee_private.h | 13 ++- drivers/tee/optee/smc_abi.c | 24 ++++-- 4 files changed, 154 insertions(+), 21 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index dba5339b61ae..c2d484201f79 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -39,9 +39,26 @@ struct optee_shm_arg_entry { DECLARE_BITMAP(map, MAX_ARG_COUNT_PER_ENTRY); }; +void optee_cq_init(struct optee_call_queue *cq, int thread_count) +{ + mutex_init(&cq->mutex); + INIT_LIST_HEAD(&cq->normal_waiters); + INIT_LIST_HEAD(&cq->sys_waiters); + /* + * If cq->total_thread_count is 0 then we're not trying to keep + * track of how many free threads we have, instead we're relying on + * the secure world to tell us when we're out of thread and have to + * wait for another thread to become available. + */ + cq->total_thread_count = thread_count; + cq->free_normal_thread_count = thread_count; +} + void optee_cq_wait_init(struct optee_call_queue *cq, - struct optee_call_waiter *w) + struct optee_call_waiter *w, bool sys_thread) { + bool need_wait = false; + /* * We're preparing to make a call to secure world. In case we can't * allocate a thread in secure world we'll end up waiting in @@ -53,15 +70,40 @@ void optee_cq_wait_init(struct optee_call_queue *cq, mutex_lock(&cq->mutex); /* - * We add ourselves to the queue, but we don't wait. This - * guarantees that we don't lose a completion if secure world - * returns busy and another thread just exited and try to complete - * someone. + * We add ourselves to a queue, but we don't wait. This guarantees + * that we don't lose a completion if secure world returns busy and + * another thread just exited and try to complete someone. */ init_completion(&w->c); - list_add_tail(&w->list_node, &cq->waiters); + w->sys_thread = sys_thread; + if (sys_thread) { + list_add_tail(&w->list_node, &cq->sys_waiters); + } else { + list_add_tail(&w->list_node, &cq->normal_waiters); + if (cq->total_thread_count) { + /* + * Claim a normal thread if one is available, else + * we'll need to wait for a normal thread to be + * released. + */ + if (cq->free_normal_thread_count > 0) + cq->free_normal_thread_count--; + else + need_wait = true; + } + } mutex_unlock(&cq->mutex); + + while (need_wait) { + optee_cq_wait_for_completion(cq, w); + mutex_lock(&cq->mutex); + if (cq->free_normal_thread_count > 0) { + cq->free_normal_thread_count--; + need_wait = false; + } + mutex_unlock(&cq->mutex); + } } void optee_cq_wait_for_completion(struct optee_call_queue *cq, @@ -74,7 +116,10 @@ void optee_cq_wait_for_completion(struct optee_call_queue *cq, /* Move to end of list to get out of the way for other waiters */ list_del(&w->list_node); reinit_completion(&w->c); - list_add_tail(&w->list_node, &cq->waiters); + if (w->sys_thread) + list_add_tail(&w->list_node, &cq->sys_waiters); + else + list_add_tail(&w->list_node, &cq->normal_waiters); mutex_unlock(&cq->mutex); } @@ -83,10 +128,19 @@ static void optee_cq_complete_one(struct optee_call_queue *cq) { struct optee_call_waiter *w; - list_for_each_entry(w, &cq->waiters, list_node) { + list_for_each_entry(w, &cq->sys_waiters, list_node) { if (!completion_done(&w->c)) { complete(&w->c); - break; + return; + } + } + + if (!cq->total_thread_count || cq->free_normal_thread_count > 0) { + list_for_each_entry(w, &cq->normal_waiters, list_node) { + if (!completion_done(&w->c)) { + complete(&w->c); + break; + } } } } @@ -104,6 +158,9 @@ void optee_cq_wait_final(struct optee_call_queue *cq, /* Get out of the list */ list_del(&w->list_node); + if (!w->sys_thread) + cq->free_normal_thread_count++; /* Release a normal thread */ + /* Wake up one eventual waiting task */ optee_cq_complete_one(cq); @@ -119,6 +176,36 @@ void optee_cq_wait_final(struct optee_call_queue *cq, mutex_unlock(&cq->mutex); } +bool optee_cq_inc_sys_thread_count(struct optee_call_queue *cq) +{ + bool rc = false; + + mutex_lock(&cq->mutex); + + /* Leave at least 1 normal (non-system) thread */ + if (cq->res_sys_thread_count + 1 < cq->total_thread_count) { + cq->free_normal_thread_count--; + cq->res_sys_thread_count++; + rc = true; + } + + mutex_unlock(&cq->mutex); + + return rc; +} + +void optee_cq_dec_sys_thread_count(struct optee_call_queue *cq) +{ + mutex_lock(&cq->mutex); + if (cq->res_sys_thread_count > 0) { + cq->res_sys_thread_count--; + cq->free_normal_thread_count++; + /* If there's someone waiting, let it resume */ + optee_cq_complete_one(cq); + } + mutex_unlock(&cq->mutex); +} + /* Requires the filpstate mutex to be held */ static struct optee_session *find_session(struct optee_context_data *ctxdata, u32 session_id) @@ -361,6 +448,27 @@ int optee_open_session(struct tee_context *ctx, return rc; } +int optee_system_session(struct tee_context *ctx, u32 session) +{ + struct optee_context_data *ctxdata = ctx->data; + struct optee *optee = tee_get_drvdata(ctx->teedev); + struct optee_session *sess; + int rc = -EINVAL; + + mutex_lock(&ctxdata->mutex); + + sess = find_session(ctxdata, session); + if (sess && !sess->use_sys_thread && + optee_cq_inc_sys_thread_count(&optee->call_queue)) { + rc = 0; + sess->use_sys_thread = true; + } + + mutex_unlock(&ctxdata->mutex); + + return rc; +} + int optee_close_session_helper(struct tee_context *ctx, u32 session, bool system_thread) { @@ -378,6 +486,8 @@ int optee_close_session_helper(struct tee_context *ctx, u32 session, msg_arg->session = session; optee->ops->do_call_with_arg(ctx, shm, offs, system_thread); + if (system_thread) + optee_cq_dec_sys_thread_count(&optee->call_queue); optee_free_msg_arg(ctx, entry, offs); return 0; diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 52cec9d06041..0c9055691343 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -528,7 +528,8 @@ static void optee_handle_ffa_rpc(struct tee_context *ctx, struct optee *optee, static int optee_ffa_yielding_call(struct tee_context *ctx, struct ffa_send_direct_data *data, - struct optee_msg_arg *rpc_arg) + struct optee_msg_arg *rpc_arg, + bool system_thread) { struct optee *optee = tee_get_drvdata(ctx->teedev); struct ffa_device *ffa_dev = optee->ffa.ffa_dev; @@ -541,7 +542,7 @@ static int optee_ffa_yielding_call(struct tee_context *ctx, int rc; /* Initialize waiter */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { rc = msg_ops->sync_send_receive(ffa_dev, data); if (rc) @@ -643,7 +644,7 @@ static int optee_ffa_do_call_with_arg(struct tee_context *ctx, if (IS_ERR(rpc_arg)) return PTR_ERR(rpc_arg); - return optee_ffa_yielding_call(ctx, &data, rpc_arg); + return optee_ffa_yielding_call(ctx, &data, rpc_arg, system_thread); } /* @@ -851,8 +852,7 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) if (rc) goto err_unreg_supp_teedev; mutex_init(&optee->ffa.mutex); - mutex_init(&optee->call_queue.mutex); - INIT_LIST_HEAD(&optee->call_queue.waiters); + optee_cq_init(&optee->call_queue, 0); optee_supp_init(&optee->supp); optee_shm_arg_cache_init(optee, arg_cache_flags); ffa_dev_set_drvdata(ffa_dev, optee); diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index 3da7960ab34a..6e0863a70843 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -43,12 +43,17 @@ typedef void (optee_invoke_fn)(unsigned long, unsigned long, unsigned long, struct optee_call_waiter { struct list_head list_node; struct completion c; + bool sys_thread; }; struct optee_call_queue { /* Serializes access to this struct */ struct mutex mutex; - struct list_head waiters; + struct list_head normal_waiters; + struct list_head sys_waiters; + int total_thread_count; + int free_normal_thread_count; + int res_sys_thread_count; }; struct optee_notif { @@ -254,6 +259,7 @@ int optee_supp_send(struct tee_context *ctx, u32 ret, u32 num_params, int optee_open_session(struct tee_context *ctx, struct tee_ioctl_open_session_arg *arg, struct tee_param *param); +int optee_system_session(struct tee_context *ctx, u32 session); int optee_close_session_helper(struct tee_context *ctx, u32 session, bool system_thread); int optee_close_session(struct tee_context *ctx, u32 session); @@ -303,8 +309,11 @@ static inline void optee_to_msg_param_value(struct optee_msg_param *mp, mp->u.value.c = p->u.value.c; } +void optee_cq_init(struct optee_call_queue *cq, int thread_count); +bool optee_cq_inc_sys_thread_count(struct optee_call_queue *cq); +void optee_cq_dec_sys_thread_count(struct optee_call_queue *cq); void optee_cq_wait_init(struct optee_call_queue *cq, - struct optee_call_waiter *w); + struct optee_call_waiter *w, bool sys_thread); void optee_cq_wait_for_completion(struct optee_call_queue *cq, struct optee_call_waiter *w); void optee_cq_wait_final(struct optee_call_queue *cq, diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index 56ebbb96ac97..2819674fd555 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -281,9 +281,10 @@ static int optee_to_msg_param(struct optee *optee, static void optee_enable_shm_cache(struct optee *optee) { struct optee_call_waiter w; + bool system_thread = false; /* We need to retry until secure world isn't busy. */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { struct arm_smccc_res res; @@ -306,9 +307,10 @@ static void optee_enable_shm_cache(struct optee *optee) static void __optee_disable_shm_cache(struct optee *optee, bool is_mapped) { struct optee_call_waiter w; + bool system_thread = false; /* We need to retry until secure world isn't busy. */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { union { struct arm_smccc_res smccc; @@ -927,7 +929,7 @@ static int optee_smc_do_call_with_arg(struct tee_context *ctx, reg_pair_from_64(¶m.a1, ¶m.a2, parg); } /* Initialize waiter */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { struct arm_smccc_res res; @@ -1209,6 +1211,7 @@ static const struct tee_driver_ops optee_clnt_ops = { .release = optee_release, .open_session = optee_open_session, .close_session = optee_close_session, + .system_session = optee_system_session, .invoke_func = optee_invoke_func, .cancel_req = optee_cancel_req, .shm_register = optee_shm_register, @@ -1356,6 +1359,16 @@ static bool optee_msg_exchange_capabilities(optee_invoke_fn *invoke_fn, return true; } +static unsigned int optee_msg_get_thread_count(optee_invoke_fn *invoke_fn) +{ + struct arm_smccc_res res; + + invoke_fn(OPTEE_SMC_GET_THREAD_COUNT, 0, 0, 0, 0, 0, 0, 0, &res); + if (res.a0) + return 0; + return res.a1; +} + static struct tee_shm_pool * optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm) { @@ -1609,6 +1622,7 @@ static int optee_probe(struct platform_device *pdev) struct optee *optee = NULL; void *memremaped_shm = NULL; unsigned int rpc_param_count; + unsigned int thread_count; struct tee_device *teedev; struct tee_context *ctx; u32 max_notif_value; @@ -1636,6 +1650,7 @@ static int optee_probe(struct platform_device *pdev) return -EINVAL; } + thread_count = optee_msg_get_thread_count(invoke_fn); if (!optee_msg_exchange_capabilities(invoke_fn, &sec_caps, &max_notif_value, &rpc_param_count)) { @@ -1725,8 +1740,7 @@ static int optee_probe(struct platform_device *pdev) if (rc) goto err_unreg_supp_teedev; - mutex_init(&optee->call_queue.mutex); - INIT_LIST_HEAD(&optee->call_queue.waiters); + optee_cq_init(&optee->call_queue, thread_count); optee_supp_init(&optee->supp); optee->smc.memremaped_shm = memremaped_shm; optee->pool = pool; From patchwork Fri May 5 17:30:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 90525 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp580087vqo; Fri, 5 May 2023 10:38:47 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7pTcMBprKq+xsv9Hl2vs4+Msrq1uqGDPnAZfFDYCHZZlSiawLBvE2ibGYUKSBPgi5S5wRA X-Received: by 2002:a05:6a20:840d:b0:f2:4f56:be57 with SMTP id c13-20020a056a20840d00b000f24f56be57mr3067990pzd.2.1683308327213; Fri, 05 May 2023 10:38:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683308327; cv=none; d=google.com; s=arc-20160816; b=UguAfqMh85IS5mcBTPGNDR5BISyf64jb2Pi4OKWJydG+rJktK8OKM1xFgmNS9Sebo+ OMGLR9RMtTNbesVHp/yDGRFQh+buxKw6EBv8soqxZUTZuR4eqfGyY4BJkL20v84sBiD6 Y+39WlU7xJ+E2EX0PBlS7mibn/Bb8bwXSmKSx1q9+lGXLwid85v5g0LRiCUHKnOqz/zR J3ZNqYila3QC7EX9FTyAi665qT1hiocXHm9mfQjepXRbWGhC3KyoGQzcX4sNIkHpuXDa mp0ZieKrQX9/RXKh8EK6NW5F2JoBao5xVZd49OsvkLOXLKYxW7LeAxR+YvSAIoDd9ueC zqJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=R88W/MsLhp/0NL5NeVi4LXMj0r/Vf48QsjmcL+kmlyQ=; b=z96HAKTtxSr2BJuOYUhxuV7YDA47Ndte6q2pq5ep1yE9tKL32DJwPnnzvU+OuNUAbl MxvQoJWBaxXOi7Mm+w17WCu84RKO+WPuV+h07Xki6p7aLhJp4k7aIOpyCogECBFVI5Zo RhCiCXnCmXukcGcs/rFg30m4r1RRrDRQJxM1ZD01FiYNy8tVGZL1ESXcAV38a8ccLOyY IVVnNF7dC9LItGoDcQCGZG9Y1IX3eC2TEJzhV1dxoCAMzELjXJgC63QgxqzydrKmOdgE IrTABCtEkNbUl69NgLa0Dd3vKeGoJFBRF47r/NGOab8btMQ3PaGtpRyeJAsTvk7AiIrj h3EQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=DPiEEnWf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g70-20020a625249000000b0063b7e907032si2517234pfb.271.2023.05.05.10.38.34; Fri, 05 May 2023 10:38:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=DPiEEnWf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232708AbjEERbb (ORCPT + 99 others); Fri, 5 May 2023 13:31:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60088 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231920AbjEERbR (ORCPT ); Fri, 5 May 2023 13:31:17 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A57CE1A1F1 for ; Fri, 5 May 2023 10:31:15 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-3f193ca059bso13909305e9.3 for ; Fri, 05 May 2023 10:31:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1683307874; x=1685899874; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=R88W/MsLhp/0NL5NeVi4LXMj0r/Vf48QsjmcL+kmlyQ=; b=DPiEEnWfbn7ckQyPjyDlULKRh9dJjv+GQ4atmaoe7clzBaXVyhNOhOdT+2gPAkxoIw 7gQ03OHdUbJ5xOEMdtULkckaNMkF+FRYKV1X/Diimu2YS+RVC1Pex+Iw3uxuI4X6ehdl O0xgXDgw5tR9ZyqBk/6UujKh8BoCb/jwWzr5LNTBoBd6HI8tINwTQY2F4YhSPzQYY0DE x+bncsomV7ZhZvQV4gJAZDPl2KIHurJTLbYT4xfL7yowy1gM70Oxb+xeLOUglPUFV42X 9XubP6qAC3+I2yQfsKPVtVY9CLYp+fJ/+oUkYA4W0DKSA6ieSsy0EnremMqhesfMHiBf UMTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683307874; x=1685899874; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=R88W/MsLhp/0NL5NeVi4LXMj0r/Vf48QsjmcL+kmlyQ=; b=JYja1lemlAiRalTfn5r7QdimXp8ykzP+c1yUG/tRmzzfF3lbEXggLdA9nDSGXPnPLR 7MhYnP6YtgyuWUftBadKQ79hskbR7viZhj0jtZuW77mZ2q2GSq9kqoKR7o3x0JJPt5Dl BDD1uX0Re937DImLcJKkX01fcKVzhu73qD08MRMR4ttOswc2H5gcDzB6uEPWckq3A7C3 xkPpiYpZffQM+z9QnLhv9DbMaZX0dx8nqab03ec8i497vqXW5TMDQuj80lnjckuZtiUe HQ3x9G2+rRvLGf6oxO9Swqy3qBMXBETqAVcdaThSy2w/bu44k7WmjLKQrwFF5VXupPjb +frQ== X-Gm-Message-State: AC+VfDzInrF4Pb2neWK2gmDj4f/Yyj5d6jFyJLuWCI8g7r14BPAt5qSD /07L33tzhN++5cnzIGwYlRzjY/nzlCF8iho1QbA= X-Received: by 2002:a5d:4101:0:b0:306:2c43:7255 with SMTP id l1-20020a5d4101000000b003062c437255mr2094516wrp.35.1683307873831; Fri, 05 May 2023 10:31:13 -0700 (PDT) Received: from lmecxl1178.lme.st.com (lfbn-nan-1-1169-52.w86-212.abo.wanadoo.fr. [86.212.112.52]) by smtp.gmail.com with ESMTPSA id a15-20020adff7cf000000b002f6176cc6desm2971170wrq.110.2023.05.05.10.31.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 May 2023 10:31:13 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v6 4/4] firmware: arm_scmi: optee: use optee system invocation Date: Fri, 5 May 2023 19:30:12 +0200 Message-Id: <20230505173012.881083-4-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230505173012.881083-1-etienne.carriere@linaro.org> References: <20230505173012.881083-1-etienne.carriere@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1765076712613882501?= X-GMAIL-MSGID: =?utf-8?q?1765076712613882501?= Changes SCMI optee transport to call tee_client_system_session() to request optee driver to provision an entry context in OP-TEE for processing OP-TEE messages. This prevents possible deadlock in case OP-TEE threads are all consumed while these may be waiting for a clock or regulator to be enable which SCMI OP-TEE service which requires a free thread context to execute. Acked-by: Sudeep Holla Signed-off-by: Etienne Carriere --- Changes since v5: - Applied Sudeep's review tag Changes since v4: - Updated to new API function tee_client_system_session() introduced in patch v5 2/3. No change since v3 Changes since v2: - Fixed syntax issues (missing ';' chars), reported by kernel test robot. Changes since v1: - Updated to use new tee API functions tee_client_request_system_context() and tee_client_release_system_context(). --- drivers/firmware/arm_scmi/optee.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/firmware/arm_scmi/optee.c b/drivers/firmware/arm_scmi/optee.c index e123de6e8c67..25bfb465484d 100644 --- a/drivers/firmware/arm_scmi/optee.c +++ b/drivers/firmware/arm_scmi/optee.c @@ -440,6 +440,10 @@ static int scmi_optee_chan_setup(struct scmi_chan_info *cinfo, struct device *de if (ret) goto err_free_shm; + ret = tee_client_system_session(scmi_optee_private->tee_ctx, channel->tee_session); + if (ret) + dev_warn(dev, "Could not switch to system session, do best effort\n"); + ret = get_channel(channel); if (ret) goto err_close_sess;