From patchwork Tue Nov 22 15:20:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052484 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2CAD5C433FE for ; Tue, 22 Nov 2022 15:21:21 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447228.703250 (Exim 4.92) (envelope-from ) id 1oxV5E-0001IY-Sb; Tue, 22 Nov 2022 15:21:12 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447228.703250; Tue, 22 Nov 2022 15:21:12 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5E-0001Fk-Gz; Tue, 22 Nov 2022 15:21:12 +0000 Received: by outflank-mailman (input) for mailman id 447228; Tue, 22 Nov 2022 15:21:11 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5D-0000Pt-Hj for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:11 +0000 Received: from esa6.hc3370-68.iphmx.com (esa6.hc3370-68.iphmx.com [216.71.155.175]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 4975d2f2-6a79-11ed-8fd2-01056ac49cbb; Tue, 22 Nov 2022 16:21:07 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 4975d2f2-6a79-11ed-8fd2-01056ac49cbb DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130467; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ftaqE+uJKqGeClk6offLXZjZa6ryJgP18AvrDuvBHds=; b=g2fmZ/SMKNZI3AztpnsMDKDOsT0r7X331qoTTfFC9ESLV5sZcFx/pPQB r81fkaZtpb+DnJwnRIqGoKnNn1FqcghxcsxWd1KD0JlLuwlOgc1cSxuby TsAs0mknAQoppXI7RQhhqIQBvHTxXsZvxGFIHYrr/3IbRsKJlfvayUWqf g=; Authentication-Results: esa6.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 84920460 X-Ironport-Server: esa6.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:4ifm4KNFDFveuKrvrR33l8FynXyQoLVcMsEvi/4bfWQNrUpxhWMBn DBJXDrSPveCMDf8KYt+atm+/ExSv8eHmN5mHAto+SlhQUwRpJueD7x1DKtS0wC6dZSfER09v 63yTvGacajYm1eF/k/F3oDJ9CU6jufQA+KmU4YoAwgpLSd8UiAtlBl/rOAwh49skLCRDhiE/ Nj/uKUzAnf8s9JPGj9SuvzrRC9H5qyo4mpB5AZmOZingXeF/5UrJMNHTU2OByOQrrl8RoaSW +vFxbelyWLVlz9F5gSNy+uTnuUiG9Y+DCDW4pZkc/HKbitq/0Te5p0TJvsEAXq7vh3S9zxHJ HehgrTrIeshFvWkdO3wyHC0GQkmVUFN0OevzXRSLaV/ZqAJGpfh66wGMa04AWEX0rsmPnNP8 /EfFD4ESRW5lrrn5ryHVPY506zPLOGzVG8eknRpzDWfBvc6W5HTBa7N4Le03h9p2JoIR6yHI ZNEN3w/N3wsYDUWUrsTILs4kP2lmT/UdDpApUjOjaE2/3LS3Ep6172F3N/9KoDbH50JwB7wS mTu3VvZWxAlF96k4yeV2Wuyp/bszR7+YddHfFG/3qEz2wDCroAJMzUaXEW2ieO0gUm/X5RYM UN80jojq+0++VKmSvH5XgakuziUsxgEQd1SHuYmrgaXxcLpDx2xXzZeCGQbMZp/6ZFwFWdCO kK1c83BWG1QoryTRHWh+L6zqAmjYXkzI1McenpRJeca2OUPsL3fnzqWEIgySP7u14ykcd3j6 2vU9XZj3t3/meZOjvzmpg6f3lpAs7CTFmYIChPrsnVJB++TTKqsfMSW5FfS9p6sx67JHwDa7 BDodyVzhd3i7K1hdwTXGo3h5Jnzu5643MT02DaC3/AJrlxBAUKLc4FK+y1ZL0x0KMsCcjKBS BaN51IJucINYyH0M/Afj2eN5yMClPiIKDgYfqqMMoomjmZZKWdrAx2ClWbPhjuwwSDAYIk0O IuBcNbEMJrpIf0P8dd3Ls9DuYIWKtcWnz6PFcuilk7/uVdcDVbMIYo43JK1RrhRxMu5TM/9q L6z6+PiJ81jbdDD IronPort-HdrOrdr: A9a23:YXERXaPQhTruqcBcTvmjsMiBIKoaSvp037Eqv3oedfUzSL3gqy nOpoV86faaslYssR0b9exofZPwJE80lqQFhrX5X43SPzUO0VHAROoJgLcKgQeQfxEWntQtrZ uIGJIeNDSfNzdHZL7BkWuFL+o= X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="84920460" From: Andrew Cooper To: Xen-devel CC: Andrew Cooper , Christian Lindig , David Scott , Edwin Torok , Rob Hoes Subject: [PATCH 1/8] tools/oxenstored: Fix incorrect scope after an if statement Date: Tue, 22 Nov 2022 15:20:36 +0000 Message-ID: <20221122152043.8518-2-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 A debug statement got inserted into a single-expression if statement. Insert brackets to give the intended meaning, rather than the actual meaning where the "let con = Connections..." is outside and executed unconditionally. This results in some unnecessary ring checks for domains which otherwise have IO credit. Fixes: 42f0581a91d4 ("tools/oxenstored: Implement live update for socket connections") Reported-by: Edwin Török Signed-off-by: Andrew Cooper --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes --- tools/ocaml/xenstored/xenstored.ml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml index ffd43a4eee64..c5dc7a28d082 100644 --- a/tools/ocaml/xenstored/xenstored.ml +++ b/tools/ocaml/xenstored/xenstored.ml @@ -475,7 +475,7 @@ let _ = let ring_scan_checker dom = (* no need to scan domains already marked as for processing *) - if not (Domain.get_io_credit dom > 0) then + if not (Domain.get_io_credit dom > 0) then ( debug "Looking up domid %d" (Domain.get_id dom); let con = Connections.find_domain cons (Domain.get_id dom) in if not (Connection.has_more_work con) then ( @@ -490,7 +490,8 @@ let _ = let n = 32 + 2 * (Domains.number domains) in info "found lazy domain %d, credit %d" (Domain.get_id dom) n; Domain.set_io_credit ~n dom - ) in + ) + ) in let last_stat_time = ref 0. in let last_scan_time = ref 0. in From patchwork Tue Nov 22 15:20:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052477 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D1926C4332F for ; Tue, 22 Nov 2022 15:21:13 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447221.703178 (Exim 4.92) (envelope-from ) id 1oxV54-00083F-C9; Tue, 22 Nov 2022 15:21:02 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447221.703178; Tue, 22 Nov 2022 15:21:02 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV54-000838-9Q; Tue, 22 Nov 2022 15:21:02 +0000 Received: by outflank-mailman (input) for mailman id 447221; Tue, 22 Nov 2022 15:21:00 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV52-00082v-QP for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:00 +0000 Received: from esa1.hc3370-68.iphmx.com (esa1.hc3370-68.iphmx.com [216.71.145.142]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 42fb11d6-6a79-11ed-91b6-6bf2151ebd3b; Tue, 22 Nov 2022 16:20:58 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 42fb11d6-6a79-11ed-91b6-6bf2151ebd3b DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130458; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1BYJug4YTOsoAI8ImSgHkkpV3S64Z2EdA3k2jZuilTM=; b=H2bLllQTlb4Rdou4xjz4HBpRYkzsLP9S1/L7bOJmr2bIf4XrkWwsKjq9 eoVkoH/W0c3W08DuLm+hiwWP7kbAdpJskQ1jlEl7gEbxK138Sg5gvAQlB syaBHSUC9KweU5moHXSaAuB5hO8hZtFob/dPOOAijvoxw2LXS4ck2BNiC Y=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 85763990 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:xhKYfqlZGOeppPb1VSwL6bno5gzTJkRdPkR7XQ2eYbSJt1+Wr1Gzt xIdCD+BbK2NYzD8LdAiPInl8UoFvJXWztAwS1Bkrig1QSMWpZLJC+rCIxarNUt+DCFhoGFPt JxCN4aafKjYaleG+39B55C49SEUOZmgH+a6U6icf3grHmeIcQ954Tp7gek1n4V0ttawBgKJq LvartbWfVSowFaYCEpNg064gE4p7aqaVA8w5ARkP6kS5gWGyxH5MbpETU2PByqgKmVrNrbSq 9brlNmR4m7f9hExPdKp+p6TnpoiG+O60aCm0xK6aoD66vRwjnVaPpUTbZLwXXx/mTSR9+2d/ f0W3XCGpaXFCYWX8AgVe0Ew/yiTpsSq8pefSZS0mZT7I0Er7xIAahihZa07FdRwxwp5PY1B3 d88BxY9MxOOvuSv5qm0V8p13cU5MNa+aevzulk4pd3YJfMvQJSFSKTW/95Imjw3g6iiH96HO ZBfM2A2Kk2dPVsfYT/7C7pn9AusrlD5fydVtxS+oq0v7nKI5AdwzKLsIJzefdniqcB9zhvH+ DmXrjyR7hcyEtuOyGCm/SKXoKzkwjnBYK89Nv6Bz6s/6LGU7jNKU0BHPbehmtG1g1Czc8hSI EsV/mwpt6da3FymSJzxUgO1pFaAvwUAQJxAHusi8gaPx6HIpQGDCQA5oiVpMYJ88pVsHHpzi wHPz4iB6SFTXKO9alay0IfJrj6LPzEzNmAfRjZfTBEZ/Iy2yG0stS4jXuqPAYbs0IOkQWGrm mHbxMQtr+5N1JBWjs1X6XiC2mvx/caRE2bZ8y2NBgqYAhVFiJlJjmBCwXzS9r5+IYmQVTFtV 1BUypHFvIji4Xxg/RFhodnh/5nzvZ5pyBWG3TZS82AJrlxAOxeLJOi8Gg1WKkZzKdojcjT0e kLVsg45zMYNYiryMPIpPNjvVZtCIU3c+TPND6C8UzazSsIpKF/vEN9GOCZ8IFwBYGBzyPpia P93gO6nDGoACLQP8dZFb7517FLqrwhgrV7uqWfTlUn7geHHPSTNIVrHWXPXBt0EAGq/iF292 75i2wGikX2zjMWWjvHrzLMu IronPort-HdrOrdr: A9a23:Oa0BY6kf0R2FyhxsXLoZZDJhUbPpDfIq3DAbv31ZSRFFG/Fxl6 iV88jzsiWE7gr5OUtQ/uxoV5PgfZqxz/NICMwqTNWftWrdyQ+VxeNZjbcKqgeIc0aVygce79 YET0EXMqyIMbEQt6jHCWeDf+rIuOP3k5yVuQ== X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="85763990" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , Andrew Cooper , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 2/8] tools/ocaml/evtchn: OCaml 5 support, fix potential resource leak Date: Tue, 22 Nov 2022 15:20:37 +0000 Message-ID: <20221122152043.8518-3-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török There is no binding for xenevtchn_close(). In principle, this is a resource leak, but the typical usage is as a singleton that lives for the lifetime of the program. Ocaml 5 no longer permits storing a naked C pointer in an Ocaml value. Therefore, use a Custom block. This allows us to use the finaliser callback to call xenevtchn_close(), if the Ocaml object goes out of scope. Signed-off-by: Edwin Török Signed-off-by: Andrew Cooper Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes --- tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c index f889a7a2e4a1..37f1cc4e1478 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c +++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c @@ -33,7 +33,22 @@ #include #include -#define _H(__h) ((xenevtchn_handle *)(__h)) +#define _H(__h) (*((xenevtchn_handle **)Data_custom_val(__h))) + +static void stub_evtchn_finalize(value v) +{ + xenevtchn_close(_H(v)); +} + +static struct custom_operations xenevtchn_ops = { + .identifier = "xenevtchn", + .finalize = stub_evtchn_finalize, + .compare = custom_compare_default, /* Can't compare */ + .hash = custom_hash_default, /* Can't hash */ + .serialize = custom_serialize_default, /* Can't serialize */ + .deserialize = custom_deserialize_default, /* Can't deserialize */ + .compare_ext = custom_compare_ext_default, /* Can't compare */ +}; CAMLprim value stub_eventchn_init(void) { @@ -48,7 +63,9 @@ CAMLprim value stub_eventchn_init(void) if (xce == NULL) caml_failwith("open failed"); - result = (value)xce; + result = caml_alloc_custom(&xenevtchn_ops, sizeof(xce), 0, 1); + _H(result) = xce; + CAMLreturn(result); } From patchwork Tue Nov 22 15:20:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052485 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 34BB1C4332F for ; Tue, 22 Nov 2022 15:21:23 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447229.703264 (Exim 4.92) (envelope-from ) id 1oxV5G-0001l2-CZ; Tue, 22 Nov 2022 15:21:14 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447229.703264; Tue, 22 Nov 2022 15:21:14 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5G-0001jW-5W; Tue, 22 Nov 2022 15:21:14 +0000 Received: by outflank-mailman (input) for mailman id 447229; Tue, 22 Nov 2022 15:21:12 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5E-0000Pt-Hn for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:12 +0000 Received: from esa6.hc3370-68.iphmx.com (esa6.hc3370-68.iphmx.com [216.71.155.175]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 4a1b946e-6a79-11ed-8fd2-01056ac49cbb; Tue, 22 Nov 2022 16:21:08 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 4a1b946e-6a79-11ed-8fd2-01056ac49cbb DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130468; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0EP93NE9oZj0G/r8F641xXDztqVUJkqAFbkxrSBRCso=; b=FuUUYDEyZqu4ivHK7Yw/6WCpzlerdU5WmyhRVq+YM0MBcbWCTPRhYFlU eBgwohKLX1zgzoVNwxMPbdtqW6FuhjWF9Mbv7OjitS8xUcGwr3JX62nCW XpoFaShNyLhXyn6GIsg/JL9sj4c+rFrb5ndHVHBKOkIwWeOvxgGrlqqhG 4=; Authentication-Results: esa6.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 84920461 X-Ironport-Server: esa6.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:/m1Og6wtyNzAYIc9EMN6t+dlxirEfRIJ4+MujC+fZmUNrF6WrkUGz mceWGzSPa7YNjT8fIglYIWwoB4CsJPSzdJiGQU4rCAxQypGp/SeCIXCJC8cHc8wwu7rFxs7s ppEOrEsCOhuExcwcz/0auCJQUFUjP3OHfykTbaeYUidfCc8IA85kxVvhuUltYBhhNm9Emult Mj75sbSIzdJ4RYtWo4vw//F+U0HUMja4mtC5AVnP6oT4DcyqlFOZH4hDfDpR5fHatE88t6SH 47r0Ly/92XFyBYhYvvNfmHTKxBirhb6ZGBiu1IOM0SQqkEqSh8ai87XAME0e0ZP4whlqvgqo Dl7WT5cfi9yVkHEsLx1vxC1iEiSN4UekFPMCSDXXcB+UyQq2pYjqhljJBheAGEWxgp4KTwfy u4ZLj0KUh6KoOeM0erqbOdQmNt2eaEHPKtH0p1h5TTQDPJgSpHfWaTao9Rf2V/chOgXQ6yYP ZBAL2MyMlKQOHWjOX9OYH46tM6uimPybHtzr1WNqLBsy2PS0BZwwP7mN9+9ltmiFZkExB7E+ DuuE2LRMhcdNPmv5Rm81U2229HxrAarBLovLejtnhJtqALKnTFCYPEMbnO3qOe0olSzUNVeL woT4CVGhbg/8gmnQ8fwWzW8oWWYpVgMVtxICeo45QqRjK3O7G6k6nMsF2AbLoZ87YlvGGJsh gThc87V6SJH7eyqW3Ob+7CoozqVPBIEdT4kaxMaUl5QizX8m73fni4jX/46TvDk1o2uQGChq 9yZhHNg3utO1Kbnw43+pAma2Gz0+/AlWyZvvm3qsnSZAhSVjWJPT6ih8hDl4PlJN+51pXHR7 SFfy6ByAA3jZKxhdRBho81XRtlFH97fbFXhbadHRvHMN12FohZPh7x47jBkP1tOOc0ZYzLva 0K7kVoPus4LYSb0MvUpPd3Z5yEWIU/ITISNaxwpRoAWPsgZmPGvoUmCmnJ8L0iyyRNxwMnTy L+QcNq2DGZyNEiU5GPeegrcuJd1rh0DKZT7H82nn0/+iODGDJNXIJ9cWGazgikCxPvsiG3oH xx3baNmFz03vDXCXxTq IronPort-HdrOrdr: A9a23:wxi1dKDj1Ql8FhDlHemq55DYdb4zR+YMi2TC1yhKJiC9Ffbo8f xG/c5rsiMc5wxxZJhNo7290ey7MBHhHP1OkO0s1NWZPDUO0VHAROoJ0WKh+UyEJ8SXzJ8l6U 4KScZD4bPLYWSS9fyKgzWFLw== X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="84920461" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , Andrew Cooper , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 3/8] tools/ocaml/evtchn: Add binding for xenevtchn_fdopen() Date: Tue, 22 Nov 2022 15:20:38 +0000 Message-ID: <20221122152043.8518-4-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török For live update, the new oxenstored needs to reconstruct an evtchn object around an existing file descriptor. Signed-off-by: Edwin Török Signed-off-by: Andrew Cooper Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes Split out of combined patch --- tools/ocaml/libs/eventchn/xeneventchn.ml | 1 + tools/ocaml/libs/eventchn/xeneventchn.mli | 4 ++++ tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/tools/ocaml/libs/eventchn/xeneventchn.ml b/tools/ocaml/libs/eventchn/xeneventchn.ml index dd00a1f0ead5..be4de82f46b9 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn.ml +++ b/tools/ocaml/libs/eventchn/xeneventchn.ml @@ -17,6 +17,7 @@ type handle external init: unit -> handle = "stub_eventchn_init" +external fdopen: Unix.file_descr -> handle = "stub_eventchn_fdopen" external fd: handle -> Unix.file_descr = "stub_eventchn_fd" type t = int diff --git a/tools/ocaml/libs/eventchn/xeneventchn.mli b/tools/ocaml/libs/eventchn/xeneventchn.mli index 08c73376438e..98b3c86f3702 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn.mli +++ b/tools/ocaml/libs/eventchn/xeneventchn.mli @@ -47,6 +47,10 @@ val init: unit -> handle (** Return an initialised event channel interface. On error it will throw a Failure exception. *) +val fdopen: Unix.file_descr -> handle +(** Return an initialised event channel interface, from an already open evtchn + file descriptor. On error it will throw a Failure exception. *) + val fd: handle -> Unix.file_descr (** Return a file descriptor suitable for Unix.select. When the descriptor becomes readable, it is safe to call 'pending'. diff --git a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c index 37f1cc4e1478..7bdf711bc150 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c +++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c @@ -69,6 +69,25 @@ CAMLprim value stub_eventchn_init(void) CAMLreturn(result); } +CAMLprim value stub_eventchn_fdopen(value fdval) +{ + CAMLparam1(fdval); + CAMLlocal1(result); + xenevtchn_handle *xce; + + caml_enter_blocking_section(); + xce = xenevtchn_fdopen(NULL, Int_val(fdval), 0); + caml_leave_blocking_section(); + + if (xce == NULL) + caml_failwith("evtchn fdopen failed"); + + result = caml_alloc_custom(&xenevtchn_ops, sizeof(xce), 0, 1); + _H(result) = xce; + + CAMLreturn(result); +} + CAMLprim value stub_eventchn_fd(value xce) { CAMLparam1(xce); From patchwork Tue Nov 22 15:20:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052478 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C4B8EC433FE for ; Tue, 22 Nov 2022 15:21:14 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447222.703190 (Exim 4.92) (envelope-from ) id 1oxV55-0008IX-La; Tue, 22 Nov 2022 15:21:03 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447222.703190; Tue, 22 Nov 2022 15:21:03 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV55-0008IO-HC; Tue, 22 Nov 2022 15:21:03 +0000 Received: by outflank-mailman (input) for mailman id 447222; Tue, 22 Nov 2022 15:21:02 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV53-00082v-T5 for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:02 +0000 Received: from esa1.hc3370-68.iphmx.com (esa1.hc3370-68.iphmx.com [216.71.145.142]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 453674ee-6a79-11ed-91b6-6bf2151ebd3b; Tue, 22 Nov 2022 16:21:00 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 453674ee-6a79-11ed-91b6-6bf2151ebd3b DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130460; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=U8Mtv4XJ0/V7GDXCKpr+dmKQ2P2iVaWXqmopORRTpv8=; b=XqtljNjkrgSEWkZba8m12/Fm83Jy19xqetAP/d2hZ+P2QnCMgsZ8cHGd 0JhP1v2EeSXR14k+Lkkj26fERMcZdd5FmfrlqO5K+fvvxDl30E4mY8g2j grMjpqOyA3r4O7+sJToMVVzBnoqjekVfZFtZ3QB/2gM2jYWUmIp4FFDTj U=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 85763998 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:hTo2yKt7nX/mPVa7uVC3M74eeefnVAReMUV32f8akzHdYApBsoF/q tZmKWqPaf+ON2ChfNklbdzloRkGvZSAn4JjTwBkrSBjQShH+JbJXdiXEBz9bniYRiHhoOCLz O1FM4Wdc5pkJpP4jk3wWlQ0hSAkjclkfpKlVKiffHg0HVU/IMsYoUoLs/YjhYJ1isSODQqIu Nfjy+XSI1bg0DNvWo4uw/vrRChH4bKj5lv0gnRkPaoR5QaEzSFJZH4iDfrZw0XQE9E88tGSH 44v/JnhlkvF8hEkDM+Sk7qTWiXmlZaLYGBiIlIPM0STqkAqSh4ai87XB9JFAatjsB2bnsgZ9 Tl4ncfYpTHFnEH7sL91vxFwS0mSNEDdkVPNCSDXXce7lyUqf5ZwqhnH4Y5f0YAwo45K7W9yG fMwMm5dcw+EnMiP/rfqZbhuqpk+NJbkBdZK0p1g5Wmx4fcORJnCR+PB5MNC3Sd2jcdLdRrcT 5NHM3w1Nk2GOkARfAdMYH49tL7Aan3XWjtUsl+K44Ew5HDe1ldZ27nxKtvFPNeNQK25m27I+ z2YpDWoUnn2MvTB4yie9Umj1tbhujHDVpgwL+K176Zl1Qj7Kms7V0RNCArTTeOCokK3Rd93M UEf/Ssq668o+ySDXtT7GhG1vnOAlhodQMZLVf037hmXzajZ6BrfAXILJgOtc/R/6pVwH2Zzk AbUwZW5XlSDrYF5V1qHqOeJsjSpExErKD4tNC0oEBYdvNba9dRbYg30cjpzLEKkpoSrR2Cok 2vT/XlWa6Y71pBSifjilbzTq3f1/8WSEFZojunCdjj9hj6VcrJJcGBBBbLzyf9bZLiUQVCa1 JTvs5jPtbteZX1hecHkfQnsIF1Kz6zfWNEkqQQzd6TNDhz0k5NjFKgJiN2EGG9nM9wfZRjia 1LJtAVa6fd7ZSX0PPcqPtzuUZp0ksAM8OgJsdiNPrJzjmVZLlfbrEmCm2bNt4wSrKTcuf5mY srKGSpdJX0bFb5m3FKLqxQ1iNcWK+FX7T27eK0XODz9jObOPyfME+9t3ZnnRrlR0Z5oaT79q 753X/ZmAT0GOAEiSkE7KbIuEG0= IronPort-HdrOrdr: A9a23:DuguTqnm83TML+DVJOEj+peXo6TpDfIU3DAbv31ZSRFFG/Fxl6 iV8sjzsiWE8Qr5OUtQ/+xoV5PhfZqxz/JICMwqTNKftWrdyQyVxeNZnOjfKlTbckWUnINgPO VbAsxD4bXLfCBHZK3BgTVQfexO/DD+ytHLudvj X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="85763998" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , "Andrew Cooper" , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 4/8] tools/ocaml/evtchn: Extend the init() binding with a cloexec flag Date: Tue, 22 Nov 2022 15:20:39 +0000 Message-ID: <20221122152043.8518-5-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török For live update, oxenstored wants to clear CLOEXEC on the evtchn handle, so it survives the execve() into the new oxenstored. Have the new interface match how cloexec works in other Ocaml standard libraries. Signed-off-by: Edwin Török Signed-off-by: Andrew Cooper Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes Split out of combined patch --- tools/ocaml/libs/eventchn/xeneventchn.ml | 5 ++++- tools/ocaml/libs/eventchn/xeneventchn.mli | 9 ++++++--- tools/ocaml/libs/eventchn/xeneventchn_stubs.c | 10 +++++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/tools/ocaml/libs/eventchn/xeneventchn.ml b/tools/ocaml/libs/eventchn/xeneventchn.ml index be4de82f46b9..c16fdd4674f7 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn.ml +++ b/tools/ocaml/libs/eventchn/xeneventchn.ml @@ -16,7 +16,10 @@ type handle -external init: unit -> handle = "stub_eventchn_init" +external _init: bool -> handle = "stub_eventchn_init" + +let init ?(cloexec=true) () = _init cloexec + external fdopen: Unix.file_descr -> handle = "stub_eventchn_fdopen" external fd: handle -> Unix.file_descr = "stub_eventchn_fd" diff --git a/tools/ocaml/libs/eventchn/xeneventchn.mli b/tools/ocaml/libs/eventchn/xeneventchn.mli index 98b3c86f3702..870429b6b53a 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn.mli +++ b/tools/ocaml/libs/eventchn/xeneventchn.mli @@ -43,9 +43,12 @@ val to_int: t -> int val of_int: int -> t -val init: unit -> handle -(** Return an initialised event channel interface. On error it - will throw a Failure exception. *) +val init: ?cloexec:bool -> unit -> handle +(** [init ?cloexec ()] + Return an initialised event channel interface. + The default is to close the underlying file descriptor + on [execve], which can be overriden with [~cloexec:false]. + On error it will throw a Failure exception. *) val fdopen: Unix.file_descr -> handle (** Return an initialised event channel interface, from an already open evtchn diff --git a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c index 7bdf711bc150..aa8a69cc1ecb 100644 --- a/tools/ocaml/libs/eventchn/xeneventchn_stubs.c +++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c @@ -50,14 +50,18 @@ static struct custom_operations xenevtchn_ops = { .compare_ext = custom_compare_ext_default, /* Can't compare */ }; -CAMLprim value stub_eventchn_init(void) +CAMLprim value stub_eventchn_init(value cloexec) { - CAMLparam0(); + CAMLparam1(cloexec); CAMLlocal1(result); xenevtchn_handle *xce; + unsigned int flags = 0; + + if ( !Bool_val(cloexec) ) + flags |= XENEVTCHN_NO_CLOEXEC; caml_enter_blocking_section(); - xce = xenevtchn_open(NULL, 0); + xce = xenevtchn_open(NULL, flags); caml_leave_blocking_section(); if (xce == NULL) From patchwork Tue Nov 22 15:20:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052482 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 82A79C43219 for ; Tue, 22 Nov 2022 15:21:19 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447224.703212 (Exim 4.92) (envelope-from ) id 1oxV5B-0000SP-4Y; Tue, 22 Nov 2022 15:21:09 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447224.703212; Tue, 22 Nov 2022 15:21:09 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5B-0000SG-16; Tue, 22 Nov 2022 15:21:09 +0000 Received: by outflank-mailman (input) for mailman id 447224; Tue, 22 Nov 2022 15:21:07 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV59-0000Pt-OP for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:07 +0000 Received: from esa2.hc3370-68.iphmx.com (esa2.hc3370-68.iphmx.com [216.71.145.153]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 46312c9c-6a79-11ed-8fd2-01056ac49cbb; Tue, 22 Nov 2022 16:21:04 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 46312c9c-6a79-11ed-8fd2-01056ac49cbb DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130464; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qRpT/sJXRqdzl+PXZvGGiTY+yIv7oFMfzWqn89Zz508=; b=CyftZprALvnpFOmmnF704TeXelRtISqcHVQ5rryv8cQtuPS0dDBrTQHE jnp/agjxzN01v5mOcp/EG9EErPGqOaGZ3ejaWl7q8JlVjh233HCm+s6m3 Iqb6tiFu0r3Pw3WMknrDOABDBgmeE8Dr0wHse/3V7RdqjYXHIQD7ungTV A=; Authentication-Results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 85360546 X-Ironport-Server: esa2.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:mqhl76D7YM3BDxVW/3vjw5YqxClBgxIJ4kV8jS/XYbTApDIk1jcCy GUbCmjQbviNZWSke492Ptuy80IE6pGAxoUwQQY4rX1jcSlH+JHPbTi7wuUcHAvJd5GeExg3h yk6QoOdRCzhZiaE/n9BCpC48T8nk/nNHuCnYAL9EngZbRd+Tys8gg5Ulec8g4p56fC0GArIs t7pyyHlEAbNNwVcbyRFtcpvlDs15K6o4WpC5ARiDRx2lAS2e0c9Xcp3yZ6ZdxMUcqEMdsamS uDKyq2O/2+x13/B3fv8z94X2mVTKlLjFVDmZkh+AsBOsTAbzsAG6Y4pNeJ0VKtio27hc+ada jl6ncfYpQ8BZsUgkQmGOvVSO3kW0aZuoNcrLZUj2CA6IoKvn3bEmp1T4E8K0YIw/NgsEGB8t tAjMC0iP0qmtfidwonmY7w57igjBJGD0II3v3hhyXfSDOo8QICFSKLPjTNa9G5u3IYUR6+YP pdHL2o0BPjDS0Qn1lM/IZQyhuq3wFL4dCVVsgm9rqsr+WnDigd21dABNfKFJ4fUHZgJwC50o Erh+GvBIRckF+eV8mC43SuHje6fniTkDdd6+LqQqacx3Qz7KnYoIBEfS1aTu/SyjU+6HdVFJ CQ86ico6KQ/6kGvZt38RAGj5m6JuAYGXNhdGPF87xuCopc4+C7AWDJCFGQYLoV76olmHlTGy 2NlgfvvO2d+sY/WZUmF65jF9xaAIwMXFjIrMHpsoRQ+3zXznG0ipkuREIc7QPXs34yd9SLYm G7T8nVn71kHpYtSjvjgowia6965jsKRJjPZ8Dk7SY5MAulRQIe+L7Kl5lHAhRqrBNbIFwLR1 JTodiX30QzvMX1uvHbXKAn1NOv1j8tpyRWF6bOvdrF4n9hXx1atfJpL/BZ1L1pzP8APdFfBO RGN6FsMucEMZiX0Msebhr5d7OxzncDd+SnNDKiIPrKinLAsHON4wM2eTRHJhD28+KTduao+J Y2aYa6R4YUyUMxaIfvfb7l17ILHMQhkmD+DHsmilUzPPHj3TCf9dIrp+WCmNogRhJ5oai2Pm zqDH6NmEylibdA= IronPort-HdrOrdr: A9a23:KzUus6F2ub7Cup9ipLqE7seALOsnbusQ8zAXP0AYc3Nom6uj5q aTdZUgpHjJYVkqOU3I9ersBEDEewK/yXcX2/h0AV7BZmnbUQKTRekIh7cKgQeQfhEWntQtrJ uIGJIRNDSfNzRHZL7BkWqFL+o= X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="85360546" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , Andrew Cooper , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 5/8] tools/oxenstored: Keep /dev/xen/evtchn open across live update Date: Tue, 22 Nov 2022 15:20:40 +0000 Message-ID: <20221122152043.8518-6-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török Closing the evtchn handle will unbind and free all local ports. The new xenstored would need to rebind all evtchns, which is work that we don't want or need to be doing during the critical handover period. However, it turns out that the Windows PV drivers also rebind their local port too across suspend/resume, leaving (o)xenstored with a stale idea of the remote port to use. In this case, reusing the established connection is the only robust option. Therefore: * Have oxenstored open /dev/xen/evtchn without CLOEXEC at start of day * Extend the handover information with the evtchn fd, and the local port number for each domain connection. * Have (the new) oxenstored recover the open handle using Xeneventchn.fdopen, and use the provided local ports rather than trying to rebind them. When this new information isn't present (i.e. live updating from an oxenstored prior to this change), the best-effort status quo will have to do. Signed-off-by: Edwin Török Signed-off-by: Andrew Cooper Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes Merge two patches to retain bisectability. Drop changes to the evtchn bindings. --- tools/ocaml/xenstored/domain.ml | 6 ++- tools/ocaml/xenstored/domains.ml | 14 +++++-- tools/ocaml/xenstored/event.ml | 8 +++- tools/ocaml/xenstored/xenstored.ml | 82 ++++++++++++++++++++++++++------------ 4 files changed, 78 insertions(+), 32 deletions(-) diff --git a/tools/ocaml/xenstored/domain.ml b/tools/ocaml/xenstored/domain.ml index 81cb59b8f1a2..527035ffdd32 100644 --- a/tools/ocaml/xenstored/domain.ml +++ b/tools/ocaml/xenstored/domain.ml @@ -61,7 +61,7 @@ let string_of_port = function | Some x -> string_of_int (Xeneventchn.to_int x) let dump d chan = - fprintf chan "dom,%d,%nd,%d\n" d.id d.mfn d.remote_port + fprintf chan "dom,%d,%nd,%d,%s\n" d.id d.mfn d.remote_port (string_of_port d.port) let notify dom = match dom.port with | None -> @@ -77,6 +77,10 @@ let bind_interdomain dom = dom.port <- Some (Event.bind_interdomain dom.eventchn dom.id dom.remote_port); debug "bound domain %d remote port %d to local port %s" dom.id dom.remote_port (string_of_port dom.port) +let restore_interdomain dom localport = + assert (dom.port = None); + dom.port <- Some (Xeneventchn.of_int localport); + debug "restored interdomain %d remote port %d to local port %s" dom.id dom.remote_port (string_of_port dom.port) let close dom = debug "domain %d unbound port %s" dom.id (string_of_port dom.port); diff --git a/tools/ocaml/xenstored/domains.ml b/tools/ocaml/xenstored/domains.ml index 17fe2fa25772..a91d2afd2a82 100644 --- a/tools/ocaml/xenstored/domains.ml +++ b/tools/ocaml/xenstored/domains.ml @@ -56,6 +56,7 @@ let exist doms id = Hashtbl.mem doms.table id let find doms id = Hashtbl.find doms.table id let number doms = Hashtbl.length doms.table let iter doms fct = Hashtbl.iter (fun _ b -> fct b) doms.table +let eventchn doms = doms.eventchn let rec is_empty_queue q = Queue.is_empty q || @@ -122,17 +123,22 @@ let cleanup doms = let resume _doms _domid = () -let create doms domid mfn port = +let maybe_bind_interdomain restore_localport dom = + match restore_localport with + | None -> Domain.bind_interdomain dom + | Some p -> Domain.restore_interdomain dom p + +let create doms domid mfn ?restore_localport port = let interface = Xenctrl.map_foreign_range xc domid (Xenmmap.getpagesize()) mfn in let dom = Domain.make domid mfn port interface doms.eventchn in Hashtbl.add doms.table domid dom; - Domain.bind_interdomain dom; + maybe_bind_interdomain restore_localport dom; dom let xenstored_kva = ref "" let xenstored_port = ref "" -let create0 doms = +let create0 ?restore_localport doms = let port, interface = ( let port = Utils.read_file_single_integer !xenstored_port @@ -146,7 +152,7 @@ let create0 doms = in let dom = Domain.make 0 Nativeint.zero port interface doms.eventchn in Hashtbl.add doms.table 0 dom; - Domain.bind_interdomain dom; + maybe_bind_interdomain restore_localport dom; Domain.notify dom; dom diff --git a/tools/ocaml/xenstored/event.ml b/tools/ocaml/xenstored/event.ml index ccca90b6fc4f..0159daac91f4 100644 --- a/tools/ocaml/xenstored/event.ml +++ b/tools/ocaml/xenstored/event.ml @@ -20,7 +20,13 @@ type t = { mutable virq_port: Xeneventchn.t option; } -let init () = { handle = Xeneventchn.init (); virq_port = None; } +let init ?fd () = + let handle = match fd with + | None -> Xeneventchn.init ~cloexec:false () + | Some fd -> Xeneventchn.fdopen fd + in + { handle; virq_port = None } + let fd eventchn = Xeneventchn.fd eventchn.handle let bind_dom_exc_virq eventchn = eventchn.virq_port <- Some (Xeneventchn.bind_dom_exc_virq eventchn.handle) let bind_interdomain eventchn domid port = Xeneventchn.bind_interdomain eventchn.handle domid port diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml index c5dc7a28d082..6ceab02dee1e 100644 --- a/tools/ocaml/xenstored/xenstored.ml +++ b/tools/ocaml/xenstored/xenstored.ml @@ -144,7 +144,7 @@ exception Bad_format of string let dump_format_header = "$xenstored-dump-format" -let from_channel_f chan global_f socket_f domain_f watch_f store_f = +let from_channel_f chan global_f event_f socket_f domain_f watch_f store_f = let unhexify s = Utils.unhexify s in let getpath s = let u = Utils.unhexify s in @@ -165,12 +165,17 @@ let from_channel_f chan global_f socket_f domain_f watch_f store_f = (* there might be more parameters here, e.g. a RO socket from a previous version: ignore it *) global_f ~rw + | "eventfd" :: eventfd :: [] -> + event_f ~eventfd | "socket" :: fd :: [] -> socket_f ~fd:(int_of_string fd) - | "dom" :: domid :: mfn :: port :: []-> + | "dom" :: domid :: mfn :: port :: rest -> domain_f (int_of_string domid) (Nativeint.of_string mfn) (int_of_string port) + (match rest with + | [] -> None (* backward compat: old version didn't have it *) + | localport :: _ -> Some (int_of_string localport)) | "watch" :: domid :: path :: token :: [] -> watch_f (int_of_string domid) (unhexify path) (unhexify token) @@ -189,10 +194,27 @@ let from_channel_f chan global_f socket_f domain_f watch_f store_f = done; info "Completed loading xenstore dump" -let from_channel store cons doms chan = +let from_channel store cons createdoms chan = (* don't let the permission get on our way, full perm ! *) let op = Store.get_ops store Perms.Connection.full_rights in let rwro = ref (None) in + let eventchnfd = ref (None) in + let doms = ref (None) in + + let require_doms () = + match !doms with + | None -> + let missing_eventchnfd = !eventchnfd = None in + if missing_eventchnfd then + warn "No event channel file descriptor available in dump!"; + let eventchn = Event.init ?fd:!eventchnfd () in + let domains = createdoms eventchn in + if missing_eventchnfd then + Event.bind_dom_exc_virq eventchn; + doms := Some domains; + domains + | Some d -> d + in let global_f ~rw = let get_listen_sock sockfd = let fd = sockfd |> int_of_string |> Utils.FD.of_int in @@ -201,6 +223,10 @@ let from_channel store cons doms chan = in rwro := get_listen_sock rw in + let event_f ~eventfd = + let fd = eventfd |> int_of_string |> Utils.FD.of_int in + eventchnfd := Some fd + in let socket_f ~fd = let ufd = Utils.FD.of_int fd in let is_valid = try (Unix.fstat ufd).Unix.st_kind = Unix.S_SOCK with _ -> false in @@ -209,12 +235,13 @@ let from_channel store cons doms chan = else warn "Ignoring invalid socket FD %d" fd in - let domain_f domid mfn port = + let domain_f domid mfn port restore_localport = + let doms = require_doms () in let ndom = if domid > 0 then - Domains.create doms domid mfn port + Domains.create doms domid mfn ?restore_localport port else - Domains.create0 doms + Domains.create0 ?restore_localport doms in Connections.add_domain cons ndom; in @@ -229,8 +256,8 @@ let from_channel store cons doms chan = op.Store.write path value; op.Store.setperms path perms in - from_channel_f chan global_f socket_f domain_f watch_f store_f; - !rwro + from_channel_f chan global_f event_f socket_f domain_f watch_f store_f; + !rwro, require_doms () let from_file store cons doms file = info "Loading xenstore dump from %s" file; @@ -238,7 +265,7 @@ let from_file store cons doms file = finally (fun () -> from_channel store doms cons channel) (fun () -> close_in channel) -let to_channel store cons rw chan = +let to_channel store cons (rw, eventchn) chan = let hexify s = Utils.hexify s in fprintf chan "%s\n" dump_format_header; @@ -247,6 +274,7 @@ let to_channel store cons rw chan = Unix.clear_close_on_exec fd; Utils.FD.to_int fd in fprintf chan "global,%d\n" (fdopt rw); + fprintf chan "eventchnfd,%d\n" (Utils.FD.to_int @@ Event.fd eventchn); (* dump connections related to domains: domid, mfn, eventchn port/ sockets, and watches *) Connections.iter cons (fun con -> Connection.dump con chan); @@ -367,7 +395,6 @@ let _ = | None -> () end; let store = Store.create () in - let eventchn = Event.init () in let next_frequent_ops = ref 0. in let advance_next_frequent_ops () = next_frequent_ops := (Unix.gettimeofday () +. !Define.conflict_max_history_seconds) @@ -375,16 +402,8 @@ let _ = let delay_next_frequent_ops_by duration = next_frequent_ops := !next_frequent_ops +. duration in - let domains = Domains.init eventchn advance_next_frequent_ops in + let domains eventchn = Domains.init eventchn advance_next_frequent_ops in - (* For things that need to be done periodically but more often - * than the periodic_ops function *) - let frequent_ops () = - if Unix.gettimeofday () > !next_frequent_ops then ( - History.trim (); - Domains.incr_conflict_credit domains; - advance_next_frequent_ops () - ) in let cons = Connections.create () in let quit = ref false in @@ -393,15 +412,15 @@ let _ = List.iter (fun path -> Store.write store Perms.Connection.full_rights path "") Store.Path.specials; - let rw_sock = + let rw_sock, domains = if cf.restart && Sys.file_exists Disk.xs_daemon_database then ( - let rwro = DB.from_file store domains cons Disk.xs_daemon_database in + let rw, domains = DB.from_file store domains cons Disk.xs_daemon_database in info "Live reload: database loaded"; - Event.bind_dom_exc_virq eventchn; Process.LiveUpdate.completed (); - rwro + rw, domains ) else ( info "No live reload: regular startup"; + let domains = domains @@ Event.init () in if !Disk.enable then ( info "reading store from disk"; Disk.read store @@ -411,13 +430,23 @@ let _ = if not (Store.path_exists store localpath) then Store.mkdir store (Perms.Connection.create 0) localpath; + let eventchn = Event.init () in if cf.domain_init then ( Connections.add_domain cons (Domains.create0 domains); Event.bind_dom_exc_virq eventchn ); - rw_sock + rw_sock, domains ) in + (* For things that need to be done periodically but more often + * than the periodic_ops function *) + let frequent_ops () = + if Unix.gettimeofday () > !next_frequent_ops then ( + History.trim (); + Domains.incr_conflict_credit domains; + advance_next_frequent_ops () + ) in + (* required for xenstore-control to detect availability of live-update *) let tool_path = Store.Path.of_string "/tool" in if not (Store.path_exists store tool_path) then @@ -433,10 +462,11 @@ let _ = Sys.set_signal Sys.sigpipe Sys.Signal_ignore; if cf.activate_access_log then begin - let post_rotate () = DB.to_file store cons (None) Disk.xs_daemon_database in + let post_rotate () = DB.to_file store cons (None, Domains.eventchn domains) Disk.xs_daemon_database in Logging.init_access_log post_rotate end; + let eventchn = Domains.eventchn domains in let spec_fds = (match rw_sock with None -> [] | Some x -> [ x ]) @ (if cf.domain_init then [ Event.fd eventchn ] else []) @@ -595,7 +625,7 @@ let _ = live_update := Process.LiveUpdate.should_run cons; if !live_update || !quit then begin (* don't initiate live update if saving state fails *) - DB.to_file store cons (rw_sock) Disk.xs_daemon_database; + DB.to_file store cons (rw_sock, eventchn) Disk.xs_daemon_database; quit := true; end with exc -> From patchwork Tue Nov 22 15:20:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052479 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2CDACC43217 for ; Tue, 22 Nov 2022 15:21:15 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447223.703201 (Exim 4.92) (envelope-from ) id 1oxV57-00008E-SP; Tue, 22 Nov 2022 15:21:05 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447223.703201; Tue, 22 Nov 2022 15:21:05 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV57-000082-Ph; Tue, 22 Nov 2022 15:21:05 +0000 Received: by outflank-mailman (input) for mailman id 447223; Tue, 22 Nov 2022 15:21:04 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV56-00082v-PN for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:04 +0000 Received: from esa1.hc3370-68.iphmx.com (esa1.hc3370-68.iphmx.com [216.71.145.142]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 46e43b0a-6a79-11ed-91b6-6bf2151ebd3b; Tue, 22 Nov 2022 16:21:03 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 46e43b0a-6a79-11ed-91b6-6bf2151ebd3b DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130463; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6E4HgUtQnG7TB7MNmlWax1xF4tEg2WobhRgUJRbXoKQ=; b=U2Rn5APIPiuwBCJiWQcdJ0UjhuEb8UJAUIisoPRaiN6JTQT31ktj7Vwz 3CUA2goMCvgneFuXxMdpq0Km2umO96z+T4N9UgYOoLsNrNPwpylGtUFsg 2xCiTGTb2H/Vvu0JhbP9sovkZPj3NVbyVbKYH4GA0f6QtzaphrYkxbxfv 4=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 85764000 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:HQRBuKs4bJThSIADhW0/O2NsY+fnVAReMUV32f8akzHdYApBsoF/q tZmKW7SPvqOZDD0fo0ibti3p0pU6sPczIc3TgVoryxgFS0Q+JbJXdiXEBz9bniYRiHhoOCLz O1FM4Wdc5pkJpP4jk3wWlQ0hSAkjclkfpKlVKiffHg0HVU/IMsYoUoLs/YjhYJ1isSODQqIu Nfjy+XSI1bg0DNvWo4uw/vrRChH4bKj5lv0gnRkPaoR5QaEzSFJZH4iDfrZw0XQE9E88tGSH 44v/JnhlkvF8hEkDM+Sk7qTWiXmlZaLYGBiIlIPM0STqkAqSh4ai87XB9JFAatjsB2bnsgZ9 Tl4ncfYpTHFnEH7sL91vxFwS0mSNEDdkVPNCSDXXce7lyUqf5ZwqhnH4Y5f0YAwo45K7W9yG fMwcBtQRAuupemM5Z2RZftghtQ6FdS3BdZK0p1g5Wmx4fcORJnCR+PB5MNC3Sd2jcdLdRrcT 5NHM3w1Nk2GOkARfAdMYH49tL7Aan3XWjtUsl+K44Ew5HDe1ldZ27nxKtvFPNeNQK25m27I+ z2YozyhWnn2MvS/7hne0VGjmdPivnymAqVCRL3p7KRD1Qj7Kms7V0RNCArTTeOCokK3Rd93M UEf/Ssq668o+ySDXtT7GhG1vnOAlhodQMZLVf037hmXzajZ6BrfAXILJgOtc/R/6pVwH2Zzk AbUwZW5XlSDrYF5V1rF3eq+th6QMhIwAkUtdyMEXRI8/oXa9dRbYg30cjpzLEKkpoSrR2Cok 2vT/XlWa6Y71pBSifjilbzTq3f1/8WSEFZojunCdjj9hj6VcrJJcGBBBbLzyf9bZLiUQVCa1 JTvs5jPtbteZX1hecHkfQnsIF1Kz6zfWNEkqQQzd6TNDhz0k5NjFKgJiN2EGG9nM9wfZRjia 1LJtAVa6fd7ZSX0PPcqPtzuUZp0ksAM8OgJsdiNPrJzjmVZLlfbrEmCm2bNt4wSrKTcuf5mY srKGSpdJX0bFb5m3FKLqxQ1iNcWK+FX7T27eK0XODz9jObOPyfME+9t3ZnnRrlR0Z5oaT79q 753X/ZmAT0FOAEiSkE7KbIuEG0= IronPort-HdrOrdr: A9a23:0z8GkanO82M7V452K5Cr/YkwRrDpDfIq3DAbv31ZSRFFG/Fxl6 iV88jzsiWE7gr5OUtQ/uxoV5PgfZqxz/NICMwqTNWftWrdyQ+VxeNZjbcKqgeIc0aVygce79 YET0EXMqyIMbEQt6jHCWeDf+rIuOP3k5yVuQ== X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="85764000" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 6/8] tools/oxenstored: Log live update issues at warning level Date: Tue, 22 Nov 2022 15:20:41 +0000 Message-ID: <20221122152043.8518-7-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török During live update, oxenstored tries a best effort approach to recover as many domains and information as possible even if it encounters errors restoring some domains. However, logging about misunderstood input is more severe than simply info. Log it at warning instead. Signed-off-by: Edwin Török Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes --- tools/ocaml/xenstored/xenstored.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml index 6ceab02dee1e..23621bd49397 100644 --- a/tools/ocaml/xenstored/xenstored.ml +++ b/tools/ocaml/xenstored/xenstored.ml @@ -184,9 +184,9 @@ let from_channel_f chan global_f event_f socket_f domain_f watch_f store_f = (Perms.Node.of_string (unhexify perms ^ "\000")) (unhexify value) | _ -> - info "restoring: ignoring unknown line: %s" line + warn "restoring: ignoring unknown line: %s" line with exn -> - info "restoring: ignoring unknown line: %s (exception: %s)" + warn "restoring: ignoring unknown line: %s (exception: %s)" line (Printexc.to_string exn); () with End_of_file -> From patchwork Tue Nov 22 15:20:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052481 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CD5AEC4167D for ; Tue, 22 Nov 2022 15:21:19 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447225.703223 (Exim 4.92) (envelope-from ) id 1oxV5C-0000k9-Jc; Tue, 22 Nov 2022 15:21:10 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447225.703223; Tue, 22 Nov 2022 15:21:10 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5C-0000jq-Gb; Tue, 22 Nov 2022 15:21:10 +0000 Received: by outflank-mailman (input) for mailman id 447225; Tue, 22 Nov 2022 15:21:08 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5A-0000Pt-HL for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:08 +0000 Received: from esa2.hc3370-68.iphmx.com (esa2.hc3370-68.iphmx.com [216.71.145.153]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 47ec3dae-6a79-11ed-8fd2-01056ac49cbb; Tue, 22 Nov 2022 16:21:06 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 47ec3dae-6a79-11ed-8fd2-01056ac49cbb DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130466; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=alWsFEiT/W2vR+rSP2qESkFw75Vrqo0QEbh3ZtJ0hE4=; b=O0Clf8tI+2zo2sFTict72Q6P0A6uAiLP5BvrabDriYq0lyPgbly+hRrv BN3tOKRgve5PnP5Repa+bAM+VvHYjTwKue9YeT+Mr4x3oMJ1DXu6s7uYO Vo1g273n446AEx0KbA3iHg33Bs0GDnWkEqYtN25PKyfETYzcL/RmP9VwE E=; Authentication-Results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 85360549 X-Ironport-Server: esa2.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:zzVsDauHIailmdrr4jvyaEIcUufnVAReMUV32f8akzHdYApBsoF/q tZmKTrQb/aNMDOheYsjYY2xpB4O6pHTmtZrHAFvpSk0F3xE+JbJXdiXEBz9bniYRiHhoOCLz O1FM4Wdc5pkJpP4jk3wWlQ0hSAkjclkfpKlVKiffHg0HVU/IMsYoUoLs/YjhYJ1isSODQqIu Nfjy+XSI1bg0DNvWo4uw/vrRChH4bKj5lv0gnRkPaoR5QaEzSFJZH4iDfrZw0XQE9E88tGSH 44v/JnhlkvF8hEkDM+Sk7qTWiXmlZaLYGBiIlIPM0STqkAqSh4ai87XB9JFAatjsB2bnsgZ9 Tl4ncfYpTHFnEH7sL91vxFwS0mSNEDdkVPNCSDXXce7lyUqf5ZwqhnH4Y5f0YAwo45K7W9yG fMwCjwnUiqs3vuMwo20eO0yq+4MB867M9ZK0p1g5Wmx4fcORJnCR+PB5MNC3Sd2jcdLdRrcT 5NHM3w1Nk2GOkARfAdMYH49tL7Aan3XWjtUsl+K44Ew5HDe1ldZ27nxKtvFPNeNQK25m27I+ zmYpzmlU3n2MvTG8hvfzHS1gNTguh7kG9ouPaeJ/M9D1Qj7Kms7V0RNCArTTeOCokK3Rd93M UEf/Ssq668o+ySDXtT7GhG1vnOAlhodQMZLVf037hmXzajZ6BrfAXILJgOtc/R/6pVwH2Zzk AbUwZW5XlSDrYF5V1q/+p2olxzrIBIXEmAwYXEpZyQu5Ins9dRbYg30cjpzLEKkpoSrR2Cok 2vT/XlWa6Y71pBSifjilbzTq3f1/8WSEFZojunCdjj9hj6VcrJJcGBBBbLzyf9bZLiUQVCa1 JTvs5jPtbteZX1hecHkfQnsIF1Kz6zfWNEkqQQzd6TNDhz0k5NjFKgJiN2EGG9nM9wfZRjia 1LJtAVa6fd7ZSX0PPcqPtzuUZp0ksAM8OgJsdiNPrJzjmVZLlfbrEmCm2bNt4wSrKTcuf5mY srKGSpdJX0bFb5m3FKLqxQ1iNcWK+FX7T27eK0XODz9jObOPyfME+9t3ZnnRrlR0Z5oaT79q 753X/ZmAT0GOAEiSkE7KbIuEG0= IronPort-HdrOrdr: A9a23:EGspqaik0FwumPxo0MLjia6tSnBQXtwji2hC6mlwRA09TySZ// rAoB19726TtN9xYgBGpTnuAsi9qB/nmKKdpLNhX4tKPzOW3FdATrsD0WKK+VSJcEfDH6xmpM JdmsBFeaTN5DNB4/oSjjPVLz9Z+qjlzJyV X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="85360549" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , Andrew Cooper , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 7/8] tools/oxenstored: Set uncaught exception handler Date: Tue, 22 Nov 2022 15:20:42 +0000 Message-ID: <20221122152043.8518-8-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török Unhandled exceptions go to stderr by default, but this doesn't typically work for oxenstored because: * daemonize reopens stderr as /dev/null * systemd redirects stderr to /dev/null too Debugging an unhandled exception requires reproducing the issue locally when using --no-fork, and is not conducive to figuring out what went wrong on a remote system. Install a custom handler which also tries to render the backtrace to the configured syslog facility, and DAEMON|ERR otherwise. Signed-off-by: Edwin Török Signed-off-by: Andrew Cooper Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes Drop print_flush as prerr_endline already flushes. --- tools/ocaml/xenstored/logging.ml | 29 +++++++++++++++++++++++++++++ tools/ocaml/xenstored/xenstored.ml | 3 ++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/tools/ocaml/xenstored/logging.ml b/tools/ocaml/xenstored/logging.ml index 39c3036155a2..255051437d60 100644 --- a/tools/ocaml/xenstored/logging.ml +++ b/tools/ocaml/xenstored/logging.ml @@ -342,3 +342,32 @@ let xb_answer ~tid ~con ~ty data = let watch_not_fired ~con perms path = let data = Printf.sprintf "EPERM perms=[%s] path=%s" perms path in access_logging ~tid:0 ~con ~data Watch_not_fired ~level:Info + +let msg_of exn bt = + Printf.sprintf "Fatal exception: %s\n%s\n" (Printexc.to_string exn) + (Printexc.raw_backtrace_to_string bt) + +let fallback_exception_handler exn bt = + (* stderr goes to /dev/null, so use the logger where possible, + but always print to stderr too, in case everything else fails, + e.g. this can be used to debug with --no-fork + + this function should try not to raise exceptions, but if it does + the ocaml runtime should still print the exception, both the original, + and the one from this function, but to stderr this time + *) + let msg = msg_of exn bt in + prerr_endline msg; + (* See Printexc.set_uncaught_exception_handler, need to flush, + so has to call stop and flush *) + match !xenstored_logger with + | Some l -> error "xenstored-fallback" "%s" msg; l.stop () + | None -> + (* Too early, no logger set yet. + We normally try to use the configured logger so we don't flood syslog + during development for example, or if the user has a file set + *) + try Syslog.log Syslog.Daemon Syslog.Err msg + with e -> + let bt = Printexc.get_raw_backtrace () in + prerr_endline @@ msg_of e bt diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml index 23621bd49397..257481285f05 100644 --- a/tools/ocaml/xenstored/xenstored.ml +++ b/tools/ocaml/xenstored/xenstored.ml @@ -357,7 +357,8 @@ let tweak_gc () = Gc.set { (Gc.get ()) with Gc.max_overhead = !Define.gc_max_overhead } -let _ = +let () = + Printexc.set_uncaught_exception_handler Logging.fallback_exception_handler; let cf = do_argv in let pidfile = if Sys.file_exists (config_filename cf) then From patchwork Tue Nov 22 15:20:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 13052480 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D2870C4332F for ; Tue, 22 Nov 2022 15:21:20 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.447227.703242 (Exim 4.92) (envelope-from ) id 1oxV5E-0001Ae-9I; Tue, 22 Nov 2022 15:21:12 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 447227.703242; Tue, 22 Nov 2022 15:21:12 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5E-00019x-4I; Tue, 22 Nov 2022 15:21:12 +0000 Received: by outflank-mailman (input) for mailman id 447227; Tue, 22 Nov 2022 15:21:10 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1oxV5C-0000Pt-He for xen-devel@lists.xenproject.org; Tue, 22 Nov 2022 15:21:10 +0000 Received: from esa2.hc3370-68.iphmx.com (esa2.hc3370-68.iphmx.com [216.71.145.153]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 49559a23-6a79-11ed-8fd2-01056ac49cbb; Tue, 22 Nov 2022 16:21:07 +0100 (CET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 49559a23-6a79-11ed-8fd2-01056ac49cbb DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1669130467; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=7gWfaxpMRzjVNfVa6VAf16WPp08zyiDdBqzCCJVKn/c=; b=XBic0HkmTYoyl+rrSKQVwmYvkvdILCdQwegw/sd+dQVqmZC+BQ+I/VBX r021Dql6KvFm9ocYiNKHXRj6MErD8PpjfnBHHGy0988KJci9kkqr5ec4a hLU1TFoivED2+NCpH4cwuQEs5rjXOyeTTNW7TFTeQYGtTuipjxhH6UOZ8 U=; Authentication-Results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none X-SBRS: None X-MesageID: 85360552 X-Ironport-Server: esa2.hc3370-68.iphmx.com X-Remote-IP: 162.221.156.83 X-Policy: $RELAYED IronPort-Data: A9a23:C1j3r6iJJLRle6uVytR2BSxrX161MhAKZh0ujC45NGQN5FlHY01je htvC2nXOauOMWTxLox2OtmzpElTuJfWmoA2SFQ+qyBgRiIb9cadCdqndUqhZCn6wu8v7q5Ex 55HNoSfdpBcolv0/ErF3m3J9CEkvU2wbuOgTrWCYmUpH1QMpB4J0XpLg/Q+jpNjne+3CgaMv cKai8DEMRqu1iUc3lg8sspvkzsy+qWs0N8klgZmP6oS5QWEzyV94K83fsldEVOpGuG4IcbiL wrz5OnR1n/U+R4rFuSknt7TGqHdauePVeQmoiM+t5mK2nCulARrukoIHKN0hXNsoyeIh7hMJ OBl7vRcf+uL0prkw4zxWzEAe8130DYvFLXveRBTuuTLp6HKnueFL1yDwyjaMKVBktubD12i+ tQgCjFTMCqswNuq2ZzicLh2qsB+Hcb0adZ3VnFIlVk1DN4jSJHHBa7L+cVZzHE7gcUm8fT2P pRDL2A1NVKZPkMJagx/5JEWxY9EglHWdTFCpU3Tjq0w+2XJlyR60aT3McqTcduPLSlQthbF/ Tyeojmjav0cHO6t5Aja016OuuzgmjLed8FMDpG6/9c/1TV/wURMUUZLBDNXu8KRhkegVvpFJ kcT+y5oqrI9nGS7Q9+4UxCmrXqsuh8HR8EWA+A88BuKyKff/0CeHGdsc9JaQIV47olsH2Vsj wLX2YOybdByjFGLYUq/9+nKlxz1ADQMAzY4NDUoSVY07Ma29enfkSnzosZf/L+d14OrSGmgm Gnb/UDSlJ1I05dVivzTEUTvxmv1+8OXFlNdChD/BDrN0+9vWGKyi2VEA3D/5O0IEouWR0LpU JMsy5nHt7Bm4X1geUWwrAQx8FKBvazt3MX02wIHInXY323FFr7KVdk4DMtCDEloKN0YXjTif VXevwhcjLcKYiX7NfIqPd3rVZp1pUQFKTgCfqmEBuein7ArLFPXlM2QTRP4M5/RfLgEzvhkZ MbznTeEBncGE6V3pAdatM9EuYLGB0kWmwvueHwM5076jerFPSfPEd/o8jKmN4gE0U9Nmy2Nm /43CidA40w3vDHWCsUPzbMuEA== IronPort-HdrOrdr: A9a23:MGh4ja6DI60Kw1nAhgPXwM7XdLJyesId70hD6qhwISY7TiX+rb HJoB17726StN9/YhAdcLy7VZVoBEmsl6KdgrNhWYtKPjOHhILAFugLhuHfKn/bakjDH4ZmpN 5dmsNFZuEYY2IXsS+D2njaL+od X-IronPort-AV: E=Sophos;i="5.96,184,1665460800"; d="scan'208";a="85360552" From: Andrew Cooper To: Xen-devel CC: =?utf-8?b?RWR3aW4gVMO2csO2aw==?= , Christian Lindig , David Scott , Rob Hoes Subject: [PATCH 8/8] tools/oxenstored/syslog: Avoid potential NULL dereference Date: Tue, 22 Nov 2022 15:20:43 +0000 Message-ID: <20221122152043.8518-9-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20221122152043.8518-1-andrew.cooper3@citrix.com> References: <20221122152043.8518-1-andrew.cooper3@citrix.com> MIME-Version: 1.0 From: Edwin Török strdup() may return NULL. Check for this before passing to syslog(). Drop const from c_msg. It is bogus, as demonstrated by the need to cast to void * in order to free the memory. Signed-off-by: Edwin Török Acked-by: Christian Lindig --- CC: Christian Lindig CC: David Scott CC: Edwin Torok CC: Rob Hoes --- tools/ocaml/xenstored/syslog_stubs.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/ocaml/xenstored/syslog_stubs.c b/tools/ocaml/xenstored/syslog_stubs.c index 875d48ad57eb..e16c3a9491d0 100644 --- a/tools/ocaml/xenstored/syslog_stubs.c +++ b/tools/ocaml/xenstored/syslog_stubs.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -35,14 +36,16 @@ static int __syslog_facility_table[] = { value stub_syslog(value facility, value level, value msg) { CAMLparam3(facility, level, msg); - const char *c_msg = strdup(String_val(msg)); + char *c_msg = strdup(String_val(msg)); int c_facility = __syslog_facility_table[Int_val(facility)] | __syslog_level_table[Int_val(level)]; + if ( !c_msg ) + caml_raise_out_of_memory(); caml_enter_blocking_section(); syslog(c_facility, "%s", c_msg); caml_leave_blocking_section(); - free((void*)c_msg); + free(c_msg); CAMLreturn(Val_unit); }