From patchwork Thu Oct 19 03:33:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dexuan Cui X-Patchwork-Id: 827924 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=microsoft.com header.i=@microsoft.com header.b="mUnn7YcQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yHZKN11NZz9tX4 for ; Thu, 19 Oct 2017 14:34:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751466AbdJSDdb (ORCPT ); Wed, 18 Oct 2017 23:33:31 -0400 Received: from mail-sg2apc01on0109.outbound.protection.outlook.com ([104.47.125.109]:36457 "EHLO APC01-SG2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751099AbdJSDd3 (ORCPT ); Wed, 18 Oct 2017 23:33:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=y6uIlN5xi3/8NopAMVg9GqMe+1j1G5roCz1ELwQWPKU=; b=mUnn7YcQNKYspVLNsfYZGAcWdgf2vsWI8wQ6lrADfrX7eZ2jn8eh6iKxJtuBUSXQ3Ea1wr7ew6Rqdy/gb4a6GDWpYYR0m+U6xhbXgu2/pWSIkXq1IPptVdhTNWEuBhAiz11bY4/4SH+1cK2ajr5BnFUpMUmoXIdlZMEiRQAc/18= Received: from KL1P15301MB0006.APCP153.PROD.OUTLOOK.COM (10.170.167.17) by KL1P15301MB0006.APCP153.PROD.OUTLOOK.COM (10.170.167.17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.178.2; Thu, 19 Oct 2017 03:33:17 +0000 Received: from KL1P15301MB0006.APCP153.PROD.OUTLOOK.COM ([10.170.167.17]) by KL1P15301MB0006.APCP153.PROD.OUTLOOK.COM ([10.170.167.17]) with mapi id 15.20.0178.002; Thu, 19 Oct 2017 03:33:14 +0000 From: Dexuan Cui To: "David S. Miller" , "netdev@vger.kernel.org" , Stephen Hemminger , "KY Srinivasan" CC: "devel@linuxdriverproject.org" , "linux-kernel@vger.kernel.org" , "Vitaly Kuznetsov" , Haiyang Zhang , Cathy Avery , Rolf Neugebauer , Marcelo Cerri , Jork Loeser Subject: [PATCH net] hv_sock: add locking in the open/close/release code paths Thread-Topic: [PATCH net] hv_sock: add locking in the open/close/release code paths Thread-Index: AdNIibDEq+u1XDcSRuahCrWKQHZFGw== Date: Thu, 19 Oct 2017 03:33:14 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=True; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Ref=https://api.informationprotection.azure.com/api/72f988bf-86f1-41af-91ab-2d7cd011db47; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Owner=decui@microsoft.com; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2017-10-18T20:33:11.0811876-07:00; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Name=General; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Application=Microsoft Azure Information Protection; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Extended_MSFT_Method=Automatic; Sensitivity=General authentication-results: spf=none (sender IP is ) smtp.mailfrom=decui@microsoft.com; x-originating-ip: [2001:4898:80e8:9::1e7] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; KL1P15301MB0006; 6:NK5JgoBLrd/4felQPHlSCx7IcqslTutNNkEbXVeCik2ir5Afr2sPjQM/YBc7QxAq9EvreEHjWN64RNv9/c1V/SRInPtDIeEwATJlrQsXyTLZup3wXre+IWZ2IsgkUw5zHkYIjRNRLrm5S4Jq1ibJRjDD76JzuAARwI4LHcoSnJ+nWqndt7JLoGaHJnTTM/S3PkSmxgRvHbQsP6ceG5lVmzQ2DEKXOW+9y0CqFkUfaRGAZrDeaKkVf3nKXelsK/tkISpjn9CHHyZHa2ykUuCqFHo50M5U3sq71tJcoGQMqSC1Z5f9DjR3C75tNgHm6j3KJgg0Z9asaqqIOsk6+0XOPtzxLX6gfau4p3hrarFSOZA=; 5:1UaofSOk6onGhmqXLfpZ5E/8WQy7z5OPbgFf46g+kAiTy6WL/UzjFhcDAHfC4/PK43HCg3A9bQa5JV0zQOVg+DHsGKRIICN4kqpkOAxx48trnWFWN9tPpjA8FvRzzVdUkNCLY86n24NT6lN8J9shLmNgRcSojpf0hQwBdGDrs7Y=; 24:Np6AiAJAf1htWb+qbujyAtZfPUSg54DK5D/sJoeXmPXRl3/eqsFIV2NNdRoaZu0D45w4YHozWYCYa8jGmM7n6Ybcl1G6PSDzMiMOFvf32lc=; 7:B89j3HRfJd09Gj2u0GPaHytamZEupV+9/smlTEoVYpUIppFbQPljvQ1M5V9soEcvlg2ez64hgC9zcFRcduZ9Nrem8f2Satb+/vibizW319NIMJ1vkYPARw81DRU4yTuOjuD72GMY0PZ05bdqwCw1p0fddcVi1BrAlad3OWjFwGfH3lkepDgUSo6Ub7t0PXF4fzPUXBs+aOPNnHI6OTJnojWIqCpwnELbop5Svo+R7hW8UIumoSAk/wEarP9tJRFC x-ms-exchange-antispam-srfa-diagnostics: SSOS;SSOR; x-forefront-antispam-report: SFV:SKI; SCL:-1; SFV:NSPM; SFS:(10019020)(6009001)(39860400002)(346002)(376002)(47760400005)(199003)(189002)(14454004)(2906002)(110136005)(54906003)(10090500001)(7736002)(316002)(22452003)(189998001)(74316002)(4326008)(86362001)(53936002)(97736004)(55016002)(7696004)(9686003)(2501003)(107886003)(86612001)(102836003)(6116002)(2900100001)(6506006)(50986999)(1511001)(10290500003)(8990500004)(6436002)(3280700002)(2561002)(33656002)(3660700001)(25786009)(77096006)(5660300001)(105586002)(106356001)(8936002)(81156014)(81166006)(305945005)(8676002)(68736007)(101416001)(6636002)(478600001)(2421001)(54356999); DIR:OUT; SFP:1102; SCL:1; SRVR:KL1P15301MB0006; H:KL1P15301MB0006.APCP153.PROD.OUTLOOK.COM; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; x-ms-office365-filtering-correlation-id: 6651f3e4-2006-44f9-4d88-08d516a221af x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(48565401081)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:KL1P15301MB0006; x-ms-traffictypediagnostic: KL1P15301MB0006: x-exchange-antispam-report-test: UriScan:(89211679590171)(198206253151910); x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(61425038)(6040450)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6055026)(61426038)(61427038)(6041248)(20161123560025)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:KL1P15301MB0006; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:KL1P15301MB0006; x-forefront-prvs: 0465429B7F received-spf: None (protection.outlook.com: microsoft.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6651f3e4-2006-44f9-4d88-08d516a221af X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Oct 2017 03:33:14.3178 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1P15301MB0006 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Without the patch, when hvs_open_connection() hasn't completely established a connection (e.g. it has changed sk->sk_state to SS_CONNECTED, but hasn't inserted the sock into the connected queue), vsock_stream_connect() may see the sk_state change and return the connection to the userspace, and next when the userspace closes the connection quickly, hvs_release() may not see the connection in the connected queue; finally hvs_open_connection() inserts the connection into the queue, but we won't be able to purge the connection for ever. Signed-off-by: Dexuan Cui Cc: K. Y. Srinivasan Cc: Haiyang Zhang Cc: Stephen Hemminger Cc: Vitaly Kuznetsov Cc: Cathy Avery Cc: Rolf Neugebauer Cc: Marcelo Cerri --- Please consider this for v4.14. net/vmw_vsock/hyperv_transport.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c index 14ed5a3..e21991f 100644 --- a/net/vmw_vsock/hyperv_transport.c +++ b/net/vmw_vsock/hyperv_transport.c @@ -310,11 +310,15 @@ static void hvs_close_connection(struct vmbus_channel *chan) struct sock *sk = get_per_channel_state(chan); struct vsock_sock *vsk = vsock_sk(sk); + lock_sock(sk); + sk->sk_state = SS_UNCONNECTED; sock_set_flag(sk, SOCK_DONE); vsk->peer_shutdown |= SEND_SHUTDOWN | RCV_SHUTDOWN; sk->sk_state_change(sk); + + release_sock(sk); } static void hvs_open_connection(struct vmbus_channel *chan) @@ -344,6 +348,8 @@ static void hvs_open_connection(struct vmbus_channel *chan) if (!sk) return; + lock_sock(sk); + if ((conn_from_host && sk->sk_state != VSOCK_SS_LISTEN) || (!conn_from_host && sk->sk_state != SS_CONNECTING)) goto out; @@ -395,9 +401,7 @@ static void hvs_open_connection(struct vmbus_channel *chan) vsock_insert_connected(vnew); - lock_sock(sk); vsock_enqueue_accept(sk, new); - release_sock(sk); } else { sk->sk_state = SS_CONNECTED; sk->sk_socket->state = SS_CONNECTED; @@ -410,6 +414,8 @@ static void hvs_open_connection(struct vmbus_channel *chan) out: /* Release refcnt obtained when we called vsock_find_bound_socket() */ sock_put(sk); + + release_sock(sk); } static u32 hvs_get_local_cid(void) @@ -476,13 +482,21 @@ static int hvs_shutdown(struct vsock_sock *vsk, int mode) static void hvs_release(struct vsock_sock *vsk) { + struct sock *sk = sk_vsock(vsk); struct hvsock *hvs = vsk->trans; - struct vmbus_channel *chan = hvs->chan; + struct vmbus_channel *chan; + lock_sock(sk); + + sk->sk_state = SS_DISCONNECTING; + vsock_remove_sock(vsk); + + release_sock(sk); + + chan = hvs->chan; if (chan) hvs_shutdown(vsk, RCV_SHUTDOWN | SEND_SHUTDOWN); - vsock_remove_sock(vsk); } static void hvs_destruct(struct vsock_sock *vsk)