From nobody Sun Nov 24 06:40:47 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=cloud.com ARC-Seal: i=1; a=rsa-sha256; t=1724317691; cv=none; d=zohomail.com; s=zohoarc; b=XAw2OHoNg4Tiru8m6Z+EfLMfeODBWFAskiS1FBpArUNxGG5d8AQ30/Vl98iublbt7czZwjNFGjZtZF5TJpVTfuQ8jxN9bbG8ckSl9sFsrqIxDWYbtpwOd19jVUEryqAhPz85nhBsZbsH2Q0aiGSaP0uxHkIHz8cn0jFbv9hv1dw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1724317691; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=apMXWG5KKVJZvsURjvsfLTCaQHUpHrA7Cdja1G+UXWs=; b=ljf9N/SsEVDXMJYSSUW2VpKwqFOdlELmRmdZwKXQ2w3vnnnb7xKbFlee96/i2cigLVNKIgZhV2/dap4i0lKTxmX5PNsUIqlOjP0zvgVY9vlzxBhSKUVOdCK+hOp4YhuGb3h2NT7OfR9/FRXFskPBRqKqYgmzjNjrxlhy9HoE6Dk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 172431769140052.82630689208861; Thu, 22 Aug 2024 02:08:11 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.781627.1191126 (Exim 4.92) (envelope-from ) id 1sh3nL-0003Je-4e; Thu, 22 Aug 2024 09:07:51 +0000 Received: by outflank-mailman (output) from mailman id 781627.1191126; Thu, 22 Aug 2024 09:07:51 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1sh3nK-0003Ha-TZ; Thu, 22 Aug 2024 09:07:50 +0000 Received: by outflank-mailman (input) for mailman id 781627; Thu, 22 Aug 2024 09:06:44 +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 1sh3mG-00031f-CA for xen-devel@lists.xenproject.org; Thu, 22 Aug 2024 09:06:44 +0000 Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [2a00:1450:4864:20::62a]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id d946fc37-6065-11ef-8776-851b0ebba9a2; Thu, 22 Aug 2024 11:06:42 +0200 (CEST) Received: by mail-ej1-x62a.google.com with SMTP id a640c23a62f3a-a866cea40c4so73624966b.0 for ; Thu, 22 Aug 2024 02:06:42 -0700 (PDT) Received: from EMEAENGAAD87503.citrite.net ([185.25.67.249]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a868f2e6717sm88948266b.96.2024.08.22.02.06.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Aug 2024 02:06:41 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version 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: d946fc37-6065-11ef-8776-851b0ebba9a2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.com; s=cloud; t=1724317602; x=1724922402; darn=lists.xenproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=apMXWG5KKVJZvsURjvsfLTCaQHUpHrA7Cdja1G+UXWs=; b=AruAVyGQhVxatR+S7RPsTdJQbBYUU+BuJeSW0pwuA7OM11GEVF8vwWfBe4vGyUFF4Q jmtskHDsuzH8VrvuAgbmE0O72JC1iE01jZXI0lQUXVgJ/6RahRxa0fei/7dyYMmpLle/ ZyqmmO4sTkg3oaokOLosDQnNQgv9uPaT2FZ5c= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724317602; x=1724922402; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=apMXWG5KKVJZvsURjvsfLTCaQHUpHrA7Cdja1G+UXWs=; b=CwHSREgkjHOMDXbS6eYHJFmFIGqIwb1GN5KQqgCmgf3DV+hu0hTzyUPNBoC8fQ5x7w I0DfvVU1jUogULuhRH8duxZQTeIJSM7fEcCQyhgUxGbiAji7OMOfTY8LBrL71u/Lpeib HD82cibKeEELiBXf/tR/yq02UyvXo46s1QyRPcFS7o60SnVHo+61rpHwZBpfcPATk06G lWP5u3c9b6LOsJuOh38C93J0TYRw2IDu9K2oZYYnjgiCH5/zkS+mO8CUDX7ZxVS+wJKb bz7sdOeFyHIXX2A0PG2doLbuT4y+u1BNCNIqJ1xIXvVTzGcjmFnrVWqNMVZjNc36vcsd vzpg== X-Gm-Message-State: AOJu0Yw9Owy8/RWXqh/eeqsBWc7lKo6xbqZGrvcyiX3NWptEwW8ucwqZ h/hMXoBUYAYKlIIRBcaCI2E5SQKLJ03scXRWv6zjsjnhMIBj4XBDy8vNO7dr53jOka8CP8LO5z+ T7mA= X-Google-Smtp-Source: AGHT+IErlCYaMdMcS77XZoDN4Dk2S07zgJchi44QkpyQRX2Xr3FKCRaBdbA86xHlcke/JOJlC4Ge8A== X-Received: by 2002:a17:907:808:b0:a77:e48d:bc8 with SMTP id a640c23a62f3a-a866f27a0d1mr448033366b.21.1724317601732; Thu, 22 Aug 2024 02:06:41 -0700 (PDT) From: Andrii Sultanov To: xen-devel@lists.xenproject.org Cc: Andrii Sultanov , Andrew Cooper , Jan Beulich , Julien Grall , Stefano Stabellini , Anthony PERARD , Christian Lindig , David Scott Subject: [PATCH v1 3/4] tools/oxenstored: Use the plugin for Xenctrl.domain_getinfo Date: Thu, 22 Aug 2024 10:06:04 +0100 Message-Id: X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @cloud.com) X-ZM-MESSAGEID: 1724317692411116600 Content-Type: text/plain; charset="utf-8" Oxenstored dynamically loads the plugin provided in ocaml/libs/xenstoredglue. The plugin is verified to be providing the specified plugin_interface during its loading. If a V2 of the plugin is produced, V1 will still be present, and a new version should only be loaded if it's verified to exist (New oxenstored can run in an environment with only V1 of the plugin). Signed-off-by: Andrii Sultanov --- Config.mk | 2 +- configure | 7 ++++ m4/paths.m4 | 4 ++ tools/configure | 7 ++++ tools/ocaml/xenstored/Makefile | 5 ++- tools/ocaml/xenstored/domains.ml | 63 +++++++++++++++++++++---------- tools/ocaml/xenstored/paths.ml.in | 1 + 7 files changed, 68 insertions(+), 21 deletions(-) diff --git a/Config.mk b/Config.mk index 1a3938b6c4..4be7d8a573 100644 --- a/Config.mk +++ b/Config.mk @@ -160,7 +160,7 @@ endef BUILD_MAKE_VARS :=3D sbindir bindir LIBEXEC LIBEXEC_BIN libdir SHAREDIR \ XENFIRMWAREDIR XEN_CONFIG_DIR XEN_SCRIPT_DIR XEN_LOCK_D= IR \ XEN_RUN_DIR XEN_PAGING_DIR XEN_DUMP_DIR XEN_LOG_DIR \ - XEN_LIB_DIR XEN_RUN_STORED + XEN_LIB_DIR XEN_RUN_STORED XEN_CTRL_DOMAININFO_PLUGIN =20 buildmakevars2file =3D $(eval $(call buildmakevars2file-closure,$(1))) define buildmakevars2file-closure diff --git a/configure b/configure index 2d7b20aa50..1a473ad2dd 100755 --- a/configure +++ b/configure @@ -631,6 +631,7 @@ XEN_PAGING_DIR XEN_LOCK_DIR INITD_DIR SHAREDIR +XEN_CTRL_DOMAININFO_PLUGIN XEN_LIB_DIR XEN_RUN_STORED XEN_LOG_DIR @@ -2199,6 +2200,12 @@ XEN_LIB_DIR=3D$localstatedir/lib/xen printf "%s\n" "#define XEN_LIB_DIR \"$XEN_LIB_DIR\"" >>confdefs.h =20 =20 +XEN_CTRL_DOMAININFO_PLUGIN=3D$LIBEXEC_BIN/xenctrl_plugin + + +printf "%s\n" "#define XEN_CTRL_DOMAININFO_PLUGIN \"$XEN_CTRL_DOMAININFO_P= LUGIN\"" >>confdefs.h + + SHAREDIR=3D$prefix/share =20 =20 diff --git a/m4/paths.m4 b/m4/paths.m4 index 3f94c62efb..e538445810 100644 --- a/m4/paths.m4 +++ b/m4/paths.m4 @@ -144,6 +144,10 @@ XEN_LIB_DIR=3D$localstatedir/lib/xen AC_SUBST(XEN_LIB_DIR) AC_DEFINE_UNQUOTED([XEN_LIB_DIR], ["$XEN_LIB_DIR"], [Xen's lib dir]) =20 +XEN_CTRL_DOMAININFO_PLUGIN=3D$LIBEXEC_BIN/xenctrl_plugin +AC_SUBST(XEN_CTRL_DOMAININFO_PLUGIN) +AC_DEFINE_UNQUOTED([XEN_CTRL_DOMAININFO_PLUGIN], ["$XEN_CTRL_DOMAININFO_PL= UGIN"], [Xenctrl's plugin for Oxenstored]) + SHAREDIR=3D$prefix/share AC_SUBST(SHAREDIR) =20 diff --git a/tools/configure b/tools/configure index 7f98303fdd..24b12a1f5d 100755 --- a/tools/configure +++ b/tools/configure @@ -743,6 +743,7 @@ XEN_PAGING_DIR XEN_LOCK_DIR INITD_DIR SHAREDIR +XEN_CTRL_DOMAININFO_PLUGIN XEN_LIB_DIR XEN_RUN_STORED XEN_LOG_DIR @@ -4530,6 +4531,12 @@ XEN_LIB_DIR=3D$localstatedir/lib/xen printf "%s\n" "#define XEN_LIB_DIR \"$XEN_LIB_DIR\"" >>confdefs.h =20 =20 +XEN_CTRL_DOMAININFO_PLUGIN=3D$LIBEXEC_BIN/xenctrl_plugin + + +printf "%s\n" "#define XEN_CTRL_DOMAININFO_PLUGIN \"$XEN_CTRL_DOMAININFO_P= LUGIN\"" >>confdefs.h + + SHAREDIR=3D$prefix/share =20 =20 diff --git a/tools/ocaml/xenstored/Makefile b/tools/ocaml/xenstored/Makefile index fa45305d8c..09896732ed 100644 --- a/tools/ocaml/xenstored/Makefile +++ b/tools/ocaml/xenstored/Makefile @@ -15,7 +15,8 @@ OCAMLINCLUDE +=3D \ -I $(OCAML_TOPLEVEL)/libs/xb \ -I $(OCAML_TOPLEVEL)/libs/mmap \ -I $(OCAML_TOPLEVEL)/libs/xc \ - -I $(OCAML_TOPLEVEL)/libs/eventchn + -I $(OCAML_TOPLEVEL)/libs/eventchn \ + -I $(OCAML_TOPLEVEL)/libs/xenstoredglue =20 LIBS =3D syslog.cma syslog.cmxa poll.cma poll.cmxa syslog_OBJS =3D syslog @@ -59,6 +60,7 @@ INTF =3D symbol.cmi trie.cmi syslog.cmi systemd.cmi poll.= cmi =20 XENSTOREDLIBS =3D \ unix.cmxa \ + dynlink.cmxa \ -ccopt -L -ccopt . syslog.cmxa \ -ccopt -L -ccopt . systemd.cmxa \ -ccopt -L -ccopt . poll.cmxa \ @@ -66,6 +68,7 @@ XENSTOREDLIBS =3D \ -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/e= ventchn/xeneventchn.cmxa \ -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xenc= trl.cmxa \ -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xenb= us.cmxa \ + -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xenstoredglue $(OCAML_TOPLEVEL)/l= ibs/xenstoredglue/plugin_interface_v1.cmxa \ -ccopt -L -ccopt $(XEN_ROOT)/tools/libs/ctrl =20 PROGRAMS =3D oxenstored diff --git a/tools/ocaml/xenstored/domains.ml b/tools/ocaml/xenstored/domai= ns.ml index 7a3056c364..e3edee6de6 100644 --- a/tools/ocaml/xenstored/domains.ml +++ b/tools/ocaml/xenstored/domains.ml @@ -20,10 +20,36 @@ let warn fmt =3D Logging.warn "domains" fmt =20 let xc =3D Xenctrl.interface_open () =20 -type domains =3D { - eventchn: Event.t; - table: (Xenctrl.domid, Domain.t) Hashtbl.t; +let load_plug fname =3D + let fail_with fmt =3D Printf.ksprintf failwith fmt in + let fname =3D Dynlink.adapt_filename fname in + if Sys.file_exists fname then + try Dynlink.loadfile fname with + | Dynlink.Error err as e -> + Printf.eprintf "ERROR loading plugin '%s': %s\n%!" fname + (Dynlink.error_message err); + raise e + | _ -> fail_with "Unknown error while loading plugin" + else fail_with "Plugin file '%s' does not exist" fname + +let () =3D + let filepath =3D Paths.xen_ctrl_plugin ^ "/domain_getinfo_v1.cmxs" in + Printf.printf "Trying to load plugin '%s'\n%!" filepath; + let list_files =3D Sys.readdir Paths.xen_ctrl_plugin in + Printf.printf "Directory listing of '%s'\n%!" Paths.xen_ctrl_plugin; + Array.iter (fun x -> Printf.printf "\t%s\n%!" x) list_files; + Dynlink.allow_only [ "Plugin_interface_v1" ]; + load_plug filepath + +module Plugin =3D + (val Plugin_interface_v1.get_plugin_v1 () + : Plugin_interface_v1.Domain_getinfo_V1) + +let handle =3D Plugin.interface_open () =20 +type domains =3D { + eventchn : Event.t; + table : (Plugin.domid, Domain.t) Hashtbl.t; (* N.B. the Queue module is not thread-safe but oxenstored is single-thr= eaded. *) (* Domains queue up to regain conflict-credit; we have a queue for domains that are carrying some penalty and so are below the @@ -93,22 +119,21 @@ let cleanup doms =3D let notify =3D ref false in let dead_dom =3D ref [] in =20 - Hashtbl.iter (fun id _ -> if id <> 0 then - try - let info =3D Xenctrl.domain_getinfo xc id in - if info.Xenctrl.shutdown || info.Xenctrl.dying then ( - debug "Domain %u died (dying=3D%b, shutdown %b -- c= ode %d)" - id info.Xenctrl.dying info.Xenctrl.shutdown info.= Xenctrl.shutdown_code; - if info.Xenctrl.dying then - dead_dom :=3D id :: !dead_dom - else - notify :=3D true; - ) - with Xenctrl.Error _ -> - debug "Domain %u died -- no domain info" id; - dead_dom :=3D id :: !dead_dom; - ) doms.table; - List.iter (fun id -> + Hashtbl.iter + (fun id _ -> + if id <> 0 then ( + try + let info =3D Plugin.domain_getinfo handle id in + if info.Plugin.shutdown || info.Plugin.dying then ( + debug "Domain %u died (dying=3D%b, shutdown %b -- code %d)" id + info.Plugin.dying info.Plugin.shutdown info.Plugin.shutdown_= code; + if info.Plugin.dying then dead_dom :=3D id :: !dead_dom else n= otify :=3D true) + with Plugin.Error _ -> + debug "Domain %u died -- no domain info" id; + dead_dom :=3D id :: !dead_dom)) + doms.table; + List.iter + (fun id -> let dom =3D Hashtbl.find doms.table id in Domain.close dom; Hashtbl.remove doms.table id; diff --git a/tools/ocaml/xenstored/paths.ml.in b/tools/ocaml/xenstored/path= s.ml.in index 37949dc8f3..67276dda94 100644 --- a/tools/ocaml/xenstored/paths.ml.in +++ b/tools/ocaml/xenstored/paths.ml.in @@ -2,3 +2,4 @@ let xen_log_dir =3D "@XEN_LOG_DIR@" let xen_config_dir =3D "@XEN_CONFIG_DIR@" let xen_run_dir =3D "@XEN_RUN_DIR@" let xen_run_stored =3D "@XEN_RUN_STORED@" +let xen_ctrl_plugin =3D "@XEN_CTRL_DOMAININFO_PLUGIN@" --=20 2.39.2