From patchwork Fri Apr 28 20:27:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 88722 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1196019vqo; Fri, 28 Apr 2023 13:33:18 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5mOhV2+BrijJ0VuJjwRrBs1T+MXqL+oisSYKcgD0snPGMfuq8EfXg44YnlLN4MDxS2sldW X-Received: by 2002:a05:6a20:3c8b:b0:f2:93b7:a452 with SMTP id b11-20020a056a203c8b00b000f293b7a452mr8170405pzj.4.1682713998592; Fri, 28 Apr 2023 13:33:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682713998; cv=none; d=google.com; s=arc-20160816; b=CADrgOSdrdBNcenF9LC8sALhQexOLwnwP3rS39WLpMVK5M5hYTEgsT1OenjCjgZaiG fRNXp0O5GhOfa/7MFUiUj0PGKsUuXbhELXEgryWxmKAI1WtAKae087RO3KSai7O2clD9 IvHRf0lWre5dGKwk5BQQzE8c455uOjwqWkvxYO2BgCQXIrH08EtYwogb8otfDqjZQBGZ Z8bzdaIylD1mbsSMZvGo8t6lc493waiotf0vLlPEnoH0kC8gQuIs7jDDXqoWJmdSL2Jz GHByWPG3m8VrzC8NssuJLwDQqTKwAymNfD1KukvIeluR3d9rOc1zAFnh/TJkbicbWd9b njbA== 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=DkAuLfIA1LUx/lCmA4KCtexilyauLFcUmjHzEvy7rws=; b=l9vzm6dHTyufVOd1pWk4bCYa4sUFMX86rtxyk5weyfJQ8937n8hZfvD0urmeFb43g9 RoCEa7lpNQVoDfmMHAxKfTHy29+kFhvW5SvSREmzSkC+PXxX2U+x/2hDtfpCSB2vzSnZ 8OIP55YqVEJicztmyUlMu0Tj/CxUsSQhI29SFuYBt+TZ2sQPpJ/Sjv5KXaee1Jjc5rnP gB7xbiDkdSmd2Bo22oSSltRVDycjhfr+gqeEYDoXE7E9mSBs+GvJ/ArMdpREe5kI1z3s oB8TOakV0XyLJPwPfsGrCZCg+2nKAV5LLt6Uo0xAOyOE82L1JZxf1u0RYCrdzCVmyWpd pI6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=A4d1WqkA; 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=redhat.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c5-20020a6566c5000000b0051f8b655dfdsi22739396pgw.18.2023.04.28.13.33.04; Fri, 28 Apr 2023 13:33:18 -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=@redhat.com header.s=mimecast20190719 header.b=A4d1WqkA; 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229862AbjD1U3G (ORCPT + 99 others); Fri, 28 Apr 2023 16:29:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47250 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346453AbjD1U27 (ORCPT ); Fri, 28 Apr 2023 16:28:59 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC8EC2107 for ; Fri, 28 Apr 2023 13:28:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1682713685; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DkAuLfIA1LUx/lCmA4KCtexilyauLFcUmjHzEvy7rws=; b=A4d1WqkA+TAUHvhVB6aOREPsxVQbXX/Z+JYnQCvBm1aUP/0hOaJoewuaLtPvIquMP31gjH F1qAMamQbERxNQEnHDSC5Gl5R+78a3Ra/sU2NeX0m40Aj4XZEQiBmIkyy1WSVWWqB4XsgT QM1X+/0kokndvoXKOSISq8uMbziqSMI= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-446-jlyFBSwpMDeMNo5CjpPXkA-1; Fri, 28 Apr 2023 16:28:03 -0400 X-MC-Unique: jlyFBSwpMDeMNo5CjpPXkA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 234FA3811F21; Fri, 28 Apr 2023 20:28:03 +0000 (UTC) Received: from warthog.procyon.org.uk.com (unknown [10.42.28.174]) by smtp.corp.redhat.com (Postfix) with ESMTP id 06D592166B4F; Fri, 28 Apr 2023 20:28:01 +0000 (UTC) From: David Howells To: netdev@vger.kernel.org Cc: David Howells , Marc Dionne , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-afs@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH net 1/3] rxrpc: Fix hard call timeout units Date: Fri, 28 Apr 2023 21:27:54 +0100 Message-Id: <20230428202756.1186269-2-dhowells@redhat.com> In-Reply-To: <20230428202756.1186269-1-dhowells@redhat.com> References: <20230428202756.1186269-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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?1764453513524216145?= X-GMAIL-MSGID: =?utf-8?q?1764453513524216145?= The hard call timeout is specified in the RXRPC_SET_CALL_TIMEOUT cmsg in seconds, so fix the point at which sendmsg() applies it to the call to convert to jiffies from seconds, not milliseconds. Fixes: a158bdd3247b ("rxrpc: Fix timeout of a call that hasn't yet been granted a channel") Signed-off-by: David Howells cc: Marc Dionne cc: "David S. Miller" cc: Eric Dumazet cc: Jakub Kicinski cc: Paolo Abeni cc: linux-afs@lists.infradead.org cc: netdev@vger.kernel.org cc: linux-kernel@vger.kernel.org --- net/rxrpc/sendmsg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index 6caa47d352ed..7498a77b5d39 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c @@ -699,7 +699,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) fallthrough; case 1: if (p.call.timeouts.hard > 0) { - j = msecs_to_jiffies(p.call.timeouts.hard); + j = p.call.timeouts.hard * HZ; now = jiffies; j += now; WRITE_ONCE(call->expect_term_by, j); From patchwork Fri Apr 28 20:27:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 88718 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1194594vqo; Fri, 28 Apr 2023 13:30:42 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4YyZpf8BaaWJ8bm6jzKCl8peIANKJMR3RQ3BMPfBAnhjPsduaG1ecvSPoWkcgxyYvEO2Lp X-Received: by 2002:a05:6a00:1706:b0:63b:7bc7:8049 with SMTP id h6-20020a056a00170600b0063b7bc78049mr10287959pfc.2.1682713842493; Fri, 28 Apr 2023 13:30:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682713842; cv=none; d=google.com; s=arc-20160816; b=LB+VQ3tGbZt0bcO1yclSr+6Uh8cKB+XNe/RJDeI8tGiR8gimoIC+khVYTflJAo/k3r S14R1xFxyfMpd+h7Eo8LcMQZqIC1k0w/si+2J0rjx3e+i4TeBogV8aasnN5Bki9VwTq6 ZBldo9KcFPwGzPLl6cZOGupbD64w5LTkEhfBj4i0nybIG0V7uWJZanAk6C/cdffLOPAU fwwHD5pkohhSFQ+oesX8xr0y+QQ80/1K/5kUnCgGhju71jOll9ujNdpuaPqiepCaLT9c +aJLsGSRXhH5vEBfjV4LnDv1Flw09CnLKYxiTHiHCZrSiP/mGFYzZMW5sK028N2udWCV 5sIg== 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=PTrMz2PfIMAWZjqyClwi15SoJPR6XaGnAtPZVNp1hQw=; b=UDXcMsZi9eM6fJaG6IUCxaqNxENdeyfZIMmCiIPcby+h5O02pWurZByuBMXKX3D3HL gEfXSXy9NLeAsMDBRxO8bVwiQ2fCBqSnJXwOsal0k/ahE10uL2H8HmoD0M7yckbi3HNn 5dOHDd8ZBacl9J8iEp+gFiz2S+Y31dc8ub0pfkwGhtBAOg94pMrY1NAxC1pWV5lp6QB2 MquHbLNY2C7l98K+C8lrgnHsADH2mo6yDsq73+pC47KjDPyZyAbhQr0TWuf9nL9M4PcR 4AMMcTrTQUbJBHk+cSHKJWt3d5ERvVMOhvVNF2HEVyT4J/8dwZTfVXIU3UKWUnOZpMIs U6yg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=cRb8iZru; 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=redhat.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d9-20020a655889000000b004ff7002e3f9si21562238pgu.164.2023.04.28.13.30.27; Fri, 28 Apr 2023 13:30:42 -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=@redhat.com header.s=mimecast20190719 header.b=cRb8iZru; 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346582AbjD1U3J (ORCPT + 99 others); Fri, 28 Apr 2023 16:29:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47268 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346125AbjD1U27 (ORCPT ); Fri, 28 Apr 2023 16:28:59 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E4D52D58 for ; Fri, 28 Apr 2023 13:28:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1682713688; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PTrMz2PfIMAWZjqyClwi15SoJPR6XaGnAtPZVNp1hQw=; b=cRb8iZrubaXwQ+Hox2P8PS7zYGIPHdkY9nBch8AybCRZHQrjaTqDruBxeY6J0tBFkSAPMN LA07StmZp+T/NfDBbijqHhsjMssBdh9nk0fE0Zh9m0FpqRPsAtEl+AczTIxJxx7L3RVpv/ JYHrmn8fNgFwSV0SOLqN3Pk3tJlFfq8= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-124-ghjhwPmqPYmD68ydMSPiVw-1; Fri, 28 Apr 2023 16:28:05 -0400 X-MC-Unique: ghjhwPmqPYmD68ydMSPiVw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DF31F3C025D3; Fri, 28 Apr 2023 20:28:04 +0000 (UTC) Received: from warthog.procyon.org.uk.com (unknown [10.42.28.174]) by smtp.corp.redhat.com (Postfix) with ESMTP id B559DC15BA0; Fri, 28 Apr 2023 20:28:03 +0000 (UTC) From: David Howells To: netdev@vger.kernel.org Cc: David Howells , Marc Dionne , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-afs@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH net 2/3] rxrpc: Make it so that a waiting process can be aborted Date: Fri, 28 Apr 2023 21:27:55 +0100 Message-Id: <20230428202756.1186269-3-dhowells@redhat.com> In-Reply-To: <20230428202756.1186269-1-dhowells@redhat.com> References: <20230428202756.1186269-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.8 X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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?1764453349864745512?= X-GMAIL-MSGID: =?utf-8?q?1764453349864745512?= When sendmsg() creates an rxrpc call, it queues it to wait for a connection and channel to be assigned and then waits before it can start shovelling data as the encrypted DATA packet content includes a summary of the connection parameters. However, sendmsg() may get interrupted before a connection gets assigned and further sendmsg() calls will fail with EBUSY until an assignment is made. Fix this so that the call can at least be aborted without failing on EBUSY. We have to be careful here as sendmsg() mustn't be allowed to start the call timer if the call doesn't yet have a connection assigned as an oops may follow shortly thereafter. Fixes: 540b1c48c37a ("rxrpc: Fix deadlock between call creation and sendmsg/recvmsg") Reported-by: Marc Dionne Signed-off-by: David Howells cc: "David S. Miller" cc: Eric Dumazet cc: Jakub Kicinski cc: Paolo Abeni cc: linux-afs@lists.infradead.org cc: netdev@vger.kernel.org cc: linux-kernel@vger.kernel.org --- net/rxrpc/sendmsg.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index 7498a77b5d39..c1b074c17b33 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c @@ -656,10 +656,13 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) goto out_put_unlock; } else { switch (rxrpc_call_state(call)) { - case RXRPC_CALL_UNINITIALISED: case RXRPC_CALL_CLIENT_AWAIT_CONN: - case RXRPC_CALL_SERVER_PREALLOC: case RXRPC_CALL_SERVER_SECURING: + if (p.command == RXRPC_CMD_SEND_ABORT) + break; + fallthrough; + case RXRPC_CALL_UNINITIALISED: + case RXRPC_CALL_SERVER_PREALLOC: rxrpc_put_call(call, rxrpc_call_put_sendmsg); ret = -EBUSY; goto error_release_sock; From patchwork Fri Apr 28 20:27:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 88719 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1194654vqo; Fri, 28 Apr 2023 13:30:49 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7KjsixP2rnqpTA4sB1FhEOrFuwSwcRDzPAHvHnrtvZqIAWdPCYNuzLGzqfei28TkGeqSBJ X-Received: by 2002:a17:902:d58c:b0:1a9:5c78:8fdf with SMTP id k12-20020a170902d58c00b001a95c788fdfmr7069189plh.36.1682713849068; Fri, 28 Apr 2023 13:30:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682713849; cv=none; d=google.com; s=arc-20160816; b=MBb8pzw/X/TQoBZ/nBsNoj2HdNJo+FKQWEiG2FfN1g5shSgxB+8UJQ5RtyyTL/db6Y UViLERLCTcfMc9sDxWAdJfoRcLZqVqUw3q9IwtZKCGO6SqpwIB8HnVow9PCkt8yHIsRP FYw14NadZUgxCTm0la1qG56jmY+W4j75X2BCLbW+6KKlUdFOiuHyrn9F+229oaa6gyBE JG3BNNF8mRrXJ1uMBLNhmynpVqQaEGktHiwK8E+mCCKGin62LUPmdE3/1cjLUpYnZ4Ey 6feHLHkemwuuLc72sanKG8KH56SJU/ySRdCZLLnvAeopGV0pgIc+WM0uljJ1T3G6zDKd spog== 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=41KUBQaFistzCqjFah0QVDYkKS+WNIdy9b94n5s+HCs=; b=EuFh2iYtqbFnEamRc3CCZq/vj1JrJM6x0oUMrU14s7bHsy63RDTiJIFKinIMhnnjfV sqkW1rCohkShuUE2jzRXU/CN7efAKPilRZdW9D6Cxd9zSQGkO6CgWOATKLj/3N4vlNSE 8SYHctJGyIQnAxfvkEsYrs/u8LjbGJp5wTEK43aWLOzWelt1ki4dxvaI2rAXNO7lha6Y SnTOB0azlRZ+80h7pylReBQcQhLYKucusOl9w4jJz4zMvhYyhADrNjxRVazFMk7PBGv5 W7Tb5JlkgYwBwMCJ7K0kJhPcT1ubyQYkFtqWDeQvABlR4bn9g7c40oh2X3O68I7w9npI B6vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=M1xAVGJq; 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=redhat.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q10-20020a170902a3ca00b001a92e587f72si17367548plb.413.2023.04.28.13.30.33; Fri, 28 Apr 2023 13:30:49 -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=@redhat.com header.s=mimecast20190719 header.b=M1xAVGJq; 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346606AbjD1U3Y (ORCPT + 99 others); Fri, 28 Apr 2023 16:29:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47288 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346624AbjD1U3F (ORCPT ); Fri, 28 Apr 2023 16:29:05 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88F8B2728 for ; Fri, 28 Apr 2023 13:28:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1682713693; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=41KUBQaFistzCqjFah0QVDYkKS+WNIdy9b94n5s+HCs=; b=M1xAVGJqhnDUlT4M8Y6sE/HjHtCRL8wf7J6gLkI+C0EBD78PhTB+hvnCTVAKrVXCFIlgjq GdlElXEcvfIGWqZu7BUqkZ9EZe1jhwzn4mZ8tspkvR+17e8Iu2EdHcKVYS3lBwJu9nWAV2 W2I3EIsutAeuccsGBFRpWyqpUgII3a8= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-158-hO9dkLOQO523hDB9GezRGw-1; Fri, 28 Apr 2023 16:28:07 -0400 X-MC-Unique: hO9dkLOQO523hDB9GezRGw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AFD4FA0F385; Fri, 28 Apr 2023 20:28:06 +0000 (UTC) Received: from warthog.procyon.org.uk.com (unknown [10.42.28.174]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9D9002166B4F; Fri, 28 Apr 2023 20:28:05 +0000 (UTC) From: David Howells To: netdev@vger.kernel.org Cc: David Howells , Marc Dionne , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-afs@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH net 3/3] rxrpc: Fix timeout of a call that hasn't yet been granted a channel Date: Fri, 28 Apr 2023 21:27:56 +0100 Message-Id: <20230428202756.1186269-4-dhowells@redhat.com> In-Reply-To: <20230428202756.1186269-1-dhowells@redhat.com> References: <20230428202756.1186269-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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?1764453357113754400?= X-GMAIL-MSGID: =?utf-8?q?1764453357113754400?= afs_make_call() calls rxrpc_kernel_begin_call() to begin a call (which may get stalled in the background waiting for a connection to become available); it then calls rxrpc_kernel_set_max_life() to set the timeouts - but that starts the call timer so the call timer might then expire before we get a connection assigned - leading to the following oops if the call stalled: BUG: kernel NULL pointer dereference, address: 0000000000000000 ... CPU: 1 PID: 5111 Comm: krxrpcio/0 Not tainted 6.3.0-rc7-build3+ #701 RIP: 0010:rxrpc_alloc_txbuf+0xc0/0x157 ... Call Trace: rxrpc_send_ACK+0x50/0x13b rxrpc_input_call_event+0x16a/0x67d rxrpc_io_thread+0x1b6/0x45f ? _raw_spin_unlock_irqrestore+0x1f/0x35 ? rxrpc_input_packet+0x519/0x519 kthread+0xe7/0xef ? kthread_complete_and_exit+0x1b/0x1b ret_from_fork+0x22/0x30 Fix this by noting the timeouts in struct rxrpc_call when the call is created. The timer will be started when the first packet is transmitted. It shouldn't be possible to trigger this directly from userspace through AF_RXRPC as sendmsg() will return EBUSY if the call is in the waiting-for-conn state if it dropped out of the wait due to a signal. Fixes: 9d35d880e0e4 ("rxrpc: Move client call connection to the I/O thread") Reported-by: Marc Dionne Signed-off-by: David Howells cc: "David S. Miller" cc: Eric Dumazet cc: Jakub Kicinski cc: Paolo Abeni cc: linux-afs@lists.infradead.org cc: netdev@vger.kernel.org cc: linux-kernel@vger.kernel.org --- fs/afs/afs.h | 4 ++-- fs/afs/internal.h | 2 +- fs/afs/rxrpc.c | 8 +++----- include/net/af_rxrpc.h | 21 +++++++++++---------- net/rxrpc/af_rxrpc.c | 3 +++ net/rxrpc/ar-internal.h | 1 + net/rxrpc/call_object.c | 9 ++++++++- net/rxrpc/sendmsg.c | 1 + 8 files changed, 30 insertions(+), 19 deletions(-) diff --git a/fs/afs/afs.h b/fs/afs/afs.h index 432cb4b23961..81815724db6c 100644 --- a/fs/afs/afs.h +++ b/fs/afs/afs.h @@ -19,8 +19,8 @@ #define AFSPATHMAX 1024 /* Maximum length of a pathname plus NUL */ #define AFSOPAQUEMAX 1024 /* Maximum length of an opaque field */ -#define AFS_VL_MAX_LIFESPAN (120 * HZ) -#define AFS_PROBE_MAX_LIFESPAN (30 * HZ) +#define AFS_VL_MAX_LIFESPAN 120 +#define AFS_PROBE_MAX_LIFESPAN 30 typedef u64 afs_volid_t; typedef u64 afs_vnodeid_t; diff --git a/fs/afs/internal.h b/fs/afs/internal.h index ad8523d0d038..68ae91d21b57 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -128,7 +128,7 @@ struct afs_call { spinlock_t state_lock; int error; /* error code */ u32 abort_code; /* Remote abort ID or 0 */ - unsigned int max_lifespan; /* Maximum lifespan to set if not 0 */ + unsigned int max_lifespan; /* Maximum lifespan in secs to set if not 0 */ unsigned request_size; /* size of request data */ unsigned reply_max; /* maximum size of reply */ unsigned count2; /* count used in unmarshalling */ diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c index e08b850c3e6d..ed1644e7683f 100644 --- a/fs/afs/rxrpc.c +++ b/fs/afs/rxrpc.c @@ -335,7 +335,9 @@ void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp) /* create a call */ rxcall = rxrpc_kernel_begin_call(call->net->socket, srx, call->key, (unsigned long)call, - tx_total_len, gfp, + tx_total_len, + call->max_lifespan, + gfp, (call->async ? afs_wake_up_async_call : afs_wake_up_call_waiter), @@ -350,10 +352,6 @@ void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp) } call->rxcall = rxcall; - - if (call->max_lifespan) - rxrpc_kernel_set_max_life(call->net->socket, rxcall, - call->max_lifespan); call->issue_time = ktime_get_real(); /* send the request */ diff --git a/include/net/af_rxrpc.h b/include/net/af_rxrpc.h index 01a35e113ab9..5531dd08061e 100644 --- a/include/net/af_rxrpc.h +++ b/include/net/af_rxrpc.h @@ -40,16 +40,17 @@ typedef void (*rxrpc_user_attach_call_t)(struct rxrpc_call *, unsigned long); void rxrpc_kernel_new_call_notification(struct socket *, rxrpc_notify_new_call_t, rxrpc_discard_new_call_t); -struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *, - struct sockaddr_rxrpc *, - struct key *, - unsigned long, - s64, - gfp_t, - rxrpc_notify_rx_t, - bool, - enum rxrpc_interruptibility, - unsigned int); +struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, + struct sockaddr_rxrpc *srx, + struct key *key, + unsigned long user_call_ID, + s64 tx_total_len, + u32 hard_timeout, + gfp_t gfp, + rxrpc_notify_rx_t notify_rx, + bool upgrade, + enum rxrpc_interruptibility interruptibility, + unsigned int debug_id); int rxrpc_kernel_send_data(struct socket *, struct rxrpc_call *, struct msghdr *, size_t, rxrpc_notify_end_tx_t); diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index c32b164206f9..31f738d65f1c 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c @@ -265,6 +265,7 @@ static int rxrpc_listen(struct socket *sock, int backlog) * @key: The security context to use (defaults to socket setting) * @user_call_ID: The ID to use * @tx_total_len: Total length of data to transmit during the call (or -1) + * @hard_timeout: The maximum lifespan of the call in sec * @gfp: The allocation constraints * @notify_rx: Where to send notifications instead of socket queue * @upgrade: Request service upgrade for call @@ -283,6 +284,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, struct key *key, unsigned long user_call_ID, s64 tx_total_len, + u32 hard_timeout, gfp_t gfp, rxrpc_notify_rx_t notify_rx, bool upgrade, @@ -313,6 +315,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, p.tx_total_len = tx_total_len; p.interruptibility = interruptibility; p.kernel = true; + p.timeouts.hard = hard_timeout; memset(&cp, 0, sizeof(cp)); cp.local = rx->local; diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index 67b0a894162d..5d44dc08f66d 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h @@ -616,6 +616,7 @@ struct rxrpc_call { unsigned long expect_term_by; /* When we expect call termination by */ u32 next_rx_timo; /* Timeout for next Rx packet (jif) */ u32 next_req_timo; /* Timeout for next Rx request packet (jif) */ + u32 hard_timo; /* Maximum lifetime or 0 (jif) */ struct timer_list timer; /* Combined event timer */ struct work_struct destroyer; /* In-process-context destroyer */ rxrpc_notify_rx_t notify_rx; /* kernel service Rx notification function */ diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c index e9f1f49d18c2..fecbc73054bc 100644 --- a/net/rxrpc/call_object.c +++ b/net/rxrpc/call_object.c @@ -226,6 +226,13 @@ static struct rxrpc_call *rxrpc_alloc_client_call(struct rxrpc_sock *rx, if (cp->exclusive) __set_bit(RXRPC_CALL_EXCLUSIVE, &call->flags); + if (p->timeouts.normal) + call->next_rx_timo = min(msecs_to_jiffies(p->timeouts.normal), 1UL); + if (p->timeouts.idle) + call->next_req_timo = min(msecs_to_jiffies(p->timeouts.idle), 1UL); + if (p->timeouts.hard) + call->hard_timo = p->timeouts.hard * HZ; + ret = rxrpc_init_client_call_security(call); if (ret < 0) { rxrpc_prefail_call(call, RXRPC_CALL_LOCAL_ERROR, ret); @@ -257,7 +264,7 @@ void rxrpc_start_call_timer(struct rxrpc_call *call) call->keepalive_at = j; call->expect_rx_by = j; call->expect_req_by = j; - call->expect_term_by = j; + call->expect_term_by = j + call->hard_timo; call->timer.expires = now; } diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index c1b074c17b33..8e0b94714e84 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c @@ -651,6 +651,7 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len) if (IS_ERR(call)) return PTR_ERR(call); /* ... and we have the call lock. */ + p.call.nr_timeouts = 0; ret = 0; if (rxrpc_call_is_complete(call)) goto out_put_unlock;