From patchwork Wed Nov 1 09:32:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442666 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 785ECC4332F for ; Wed, 1 Nov 2023 09:33:46 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626228.976319 (Exim 4.92) (envelope-from ) id 1qy7bV-0006C0-CB; Wed, 01 Nov 2023 09:33:37 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626228.976319; Wed, 01 Nov 2023 09:33:37 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7bV-0006Bt-9O; Wed, 01 Nov 2023 09:33:37 +0000 Received: by outflank-mailman (input) for mailman id 626228; Wed, 01 Nov 2023 09:33:35 +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 1qy7bT-0005E0-9T for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:33:35 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [2001:67c:2178:6::1d]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id ba4e3bae-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:33:34 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 6F5481F74A; Wed, 1 Nov 2023 09:33:34 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 5593113460; Wed, 1 Nov 2023 09:33:34 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id HrKPE24bQmWgCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:33:34 +0000 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: ba4e3bae-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831214; h=from:from:reply-to: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=KX1+eDPCalxeEFEgNKEP+cxmDRb/81lwwxJPAyo97p8=; b=WSXsFID7DYLhmnxGXvKweUBY3i7yGXby1zTK3AGZr86Zo8taPPKPldaKwHeQsyU4nOxmrc +reDoRvzVt0rgkQer482r4vayPWu+gbIDirL4jJS7YCNHE951FOyqSL+M6FtdfrJWfS7Qz Q+IztHn/l618cpy1VAGAJKOTxte2xLY= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross Subject: [PATCH 01/29] xen/public: add some more 9pfs xenstore paths Date: Wed, 1 Nov 2023 10:32:57 +0100 Message-Id: <20231101093325.30302-2-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add some optional additional backend paths for 9pfs PV devices. Those paths will be supported by the new xenlogd 9pfs backend. Signed-off-by: Juergen Gross --- xen/include/public/io/9pfs.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/xen/include/public/io/9pfs.h b/xen/include/public/io/9pfs.h index 9ad2773082..ac4bf0434b 100644 --- a/xen/include/public/io/9pfs.h +++ b/xen/include/public/io/9pfs.h @@ -71,6 +71,40 @@ * created on the guest (no user ownership squash or remap) * Only "none" is supported in this version of the protocol. * + * max-files + * Values: + * + * The maximum number of files (including directories) allowed for + * this device. Backend support of this node is optional. If the node + * is not present or the value is zero the number of files is not + * limited. + * + * max-open-files + * Values: + * + * The maximum number of files the guest is allowed to have opened + * concurrently. Multiple concurrent opens of the same file are counted + * individually. Backend support of this node is optional. If the node + * is not present or the value is zero a backend specific default is + * applied. + * + * max-space + * Values: + * + * The maximum file space in MiBs the guest is allowed to use for this + * device. Backend support of this node is optional. If the node is + * not present or the value is zero the space is not limited. + * + * auto-delete + * Values: + * + * When set to "1" the backend will delete the file with the oldest + * modification date below in case the allowed maximum file + * space (see ) or file number (see ) is being + * exceeded due to guest activity (creation or extension of files). + * Files currently opened by the guest won't be deleted. Backend + * support of this node is optional. + * ****************************************************************************** * Frontend XenBus Nodes ****************************************************************************** From patchwork Wed Nov 1 09:32:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442669 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 C058AC4167D for ; Wed, 1 Nov 2023 09:33:57 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626237.976329 (Exim 4.92) (envelope-from ) id 1qy7ba-0006Z0-K8; Wed, 01 Nov 2023 09:33:42 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626237.976329; Wed, 01 Nov 2023 09:33:42 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7ba-0006Yr-HP; Wed, 01 Nov 2023 09:33:42 +0000 Received: by outflank-mailman (input) for mailman id 626237; Wed, 01 Nov 2023 09:33:42 +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 1qy7bZ-0005sN-W9 for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:33:41 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id bd92e289-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:33:40 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 063D921835; Wed, 1 Nov 2023 09:33:40 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id D607413460; Wed, 1 Nov 2023 09:33:39 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id ttESM3MbQmWpCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:33:39 +0000 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: bd92e289-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831220; h=from:from:reply-to: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=6PS/B4Q2Vo5wSif1LySkXXDYKmcLHmew3UeAfGM1754=; b=LahJQ7AYFfYHpbMQyR4BIp13vK/OpGZ8Yv3ohtloNscXyy1IAs59lN10gBGxq09bfHFQ1C cyozIzBuGI6kDb22YkYc5Mkes7IIbdlokshXUgy5d9z9vnyK80rjXGt82skhYoBCY7HjV4 PB/PublIvSGlwhkrpKGrX2/Hx7oHqp0= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 02/29] tools: add a new xen logging daemon Date: Wed, 1 Nov 2023 10:32:58 +0100 Message-Id: <20231101093325.30302-3-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add "xenlogd", a new logging daemon meant to support infrastructure domains (e.g. xenstore-stubdom) to write log files in dom0. For now only add the code needed for starting the daemon and registering it with Xenstore via a new "/tool/xenlog/state" node by writing the "running" state to it. Signed-off-by: Juergen Gross --- tools/Makefile | 1 + tools/xenlogd/.gitignore | 1 + tools/xenlogd/Makefile | 38 ++++++++++ tools/xenlogd/xenlogd.c | 145 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 tools/xenlogd/.gitignore create mode 100644 tools/xenlogd/Makefile create mode 100644 tools/xenlogd/xenlogd.c diff --git a/tools/Makefile b/tools/Makefile index 3a510663a0..0225020416 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -32,6 +32,7 @@ SUBDIRS-y += xenpmd SUBDIRS-$(CONFIG_GOLANG) += golang SUBDIRS-y += xl SUBDIRS-y += helpers +SUBDIRS-y += xenlogd SUBDIRS-$(CONFIG_X86) += xenpaging SUBDIRS-$(CONFIG_X86) += debugger SUBDIRS-$(CONFIG_TESTS) += tests diff --git a/tools/xenlogd/.gitignore b/tools/xenlogd/.gitignore new file mode 100644 index 0000000000..a0305ae096 --- /dev/null +++ b/tools/xenlogd/.gitignore @@ -0,0 +1 @@ +/xenlogd diff --git a/tools/xenlogd/Makefile b/tools/xenlogd/Makefile new file mode 100644 index 0000000000..550e914f59 --- /dev/null +++ b/tools/xenlogd/Makefile @@ -0,0 +1,38 @@ +# +# tools/helpers/Makefile +# + +XEN_ROOT = $(CURDIR)/../.. +include $(XEN_ROOT)/tools/Rules.mk + +CFLAGS += $(PTHREAD_CFLAGS) +LDFLAGS += $(PTHREAD_LDFLAGS) + +TARGETS := xenlogd + +XENLOGD_OBJS = xenlogd.o +$(XENLOGD_OBJS): CFLAGS += $(CFLAGS_libxenstore) +$(XENLOGD_OBJS): CFLAGS += $(CFLAGS_libxenevtchn) +$(XENLOGD_OBJS): CFLAGS += $(CFLAGS_libxengnttab) +xenlogd: LDLIBS += $(call xenlibs-ldlibs,store evtchn gnttab) + +.PHONY: all +all: $(TARGETS) + +xenlogd: $(XENLOGD_OBJS) + $(CC) $(LDFLAGS) -o $@ $(XENLOGD_OBJS) $(LDLIBS) $(APPEND_LDFLAGS) + +.PHONY: install +install: all + $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC_BIN) + for i in $(TARGETS); do $(INSTALL_PROG) $$i $(DESTDIR)$(LIBEXEC_BIN); done + +.PHONY: uninstall +uninstall: + for i in $(TARGETS); do rm -f $(DESTDIR)$(LIBEXEC_BIN)/$$i; done + +.PHONY: clean +clean: + $(RM) *.o $(TARGETS) $(DEPS_RM) + +distclean: clean diff --git a/tools/xenlogd/xenlogd.c b/tools/xenlogd/xenlogd.c new file mode 100644 index 0000000000..792d1026a3 --- /dev/null +++ b/tools/xenlogd/xenlogd.c @@ -0,0 +1,145 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * xenlogd - Xen logging daemon + * + * Copyright (C) 2023 Juergen Gross + * + * Daemon to enable guests to access a directory of the dom0 file system. + * Access is made via the 9pfs protocol (xenlogd acts as a PV 9pfs backend). + * + * Usage: xenlogd + * + * xenlogd does NOT support writing any links (neither soft links nor hard + * links), and it is accepting only canonicalized file paths in order to + * avoid the possibility to "escape" from the guest specific directory. + * + * The backend device string is "xen_9pfs", the tag used for mounting the + * 9pfs device is "Xen". + * + * As an additional security measure the maximum file space used by the guest + * can be limited by the backend Xenstore node "max-size" specifying the size + * in MBytes. This size includes the size of the root directory of the guest. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static bool stop_me; +static bool daemon_running; +static struct xs_handle *xs; +static xengnttab_handle *xg; +static xenevtchn_handle *xe; + +static void handle_stop(int sig) +{ + stop_me = true; +} + +static void close_all(void) +{ + if ( daemon_running ) + xs_rm(xs, XBT_NULL, "/tool/xenlog"); + if ( xe ) + xenevtchn_close(xe); + if ( xg ) + xengnttab_close(xg); + if ( xs ) + xs_close(xs); + closelog(); +} + +static void do_err(const char *msg) +{ + syslog(LOG_ALERT, "%s, errno = %d", msg, errno); + close_all(); + exit(1); +} + +static void xen_connect(void) +{ + xs_transaction_t t; + char *val; + unsigned int len; + + xs = xs_open(0); + if ( xs == NULL ) + do_err("xs_open() failed"); + + xg = xengnttab_open(NULL, 0); + if ( xg == NULL ) + do_err("xengnttab_open() failed"); + + xe = xenevtchn_open(NULL, 0); + if ( xe == NULL ) + do_err("xenevtchn_open() failed"); + + while ( true ) + { + t = xs_transaction_start(xs); + if ( t == XBT_NULL ) + do_err("xs_transaction_start() failed"); + + val = xs_read(xs, t, "/tool/xenlog/state", &len); + if ( val ) + { + free(val); + xs_transaction_end(xs, t, true); + do_err("daemon already running"); + } + + if ( !xs_write(xs, t, "/tool/xenlog/state", "running", + strlen("running")) ) + { + xs_transaction_end(xs, t, true); + do_err("xs_write() failed writing state"); + } + + if ( xs_transaction_end(xs, t, false) ) + break; + if ( errno != EAGAIN ) + do_err("xs_transaction_end() failed"); + } + + daemon_running = true; +} + +int main(int argc, char *argv[]) +{ + struct sigaction act = { .sa_handler = handle_stop, }; + int syslog_mask = LOG_MASK(LOG_WARNING) | LOG_MASK(LOG_ERR) | + LOG_MASK(LOG_CRIT) | LOG_MASK(LOG_ALERT) | + LOG_MASK(LOG_EMERG); + + umask(027); + if ( getenv("XENLOGD_VERBOSE") ) + syslog_mask |= LOG_MASK(LOG_NOTICE) | LOG_MASK(LOG_INFO); + openlog("xenlogd", LOG_CONS, LOG_DAEMON); + setlogmask(syslog_mask); + + sigemptyset(&act.sa_mask); + sigaction(SIGHUP, &act, NULL); + + xen_connect(); + + while ( !stop_me ) + { + sleep(60); + } + + close_all(); + + return 0; +} From patchwork Wed Nov 1 09:32:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442668 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 16A63C4332F for ; Wed, 1 Nov 2023 09:33:57 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626239.976339 (Exim 4.92) (envelope-from ) id 1qy7bf-0006vt-Sg; Wed, 01 Nov 2023 09:33:47 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626239.976339; Wed, 01 Nov 2023 09:33:47 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7bf-0006vm-PF; Wed, 01 Nov 2023 09:33:47 +0000 Received: by outflank-mailman (input) for mailman id 626239; Wed, 01 Nov 2023 09:33:47 +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 1qy7be-0005E0-Ty for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:33:47 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id c0fa375b-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:33:45 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 9F8971F74A; Wed, 1 Nov 2023 09:33:45 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 6E73B13460; Wed, 1 Nov 2023 09:33:45 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id RtuLGXkbQmWvCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:33:45 +0000 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: c0fa375b-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831225; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zFW/VVQvgTZ+SrJ4qsC1qy917Hvkbh1EVGyIT8Z0qbI=; b=olZzq8l+lY4WagEYglSvD4Y15X3o8GxtCbwHERZLihNRN4LtJ74VzjJfJvKVijMoWkdrgA T4Q63PGPKbuf25mZU3HoNV4oGEm4g4muhaykikOBLWQqrtKKpQfau9pDyB+JLOzLMkap1W WxWH6+q/p6aCE+XzfHi/KDdEKiMNiR8= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 03/29] tools/xenlogd: connect to frontend Date: Wed, 1 Nov 2023 10:32:59 +0100 Message-Id: <20231101093325.30302-4-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the code for connecting to frontends to xenlogd. Signed-off-by: Juergen Gross --- tools/xenlogd/Makefile | 2 +- tools/xenlogd/io.c | 45 ++++ tools/xenlogd/xenlogd.c | 575 +++++++++++++++++++++++++++++++++++++++- tools/xenlogd/xenlogd.h | 50 ++++ 4 files changed, 668 insertions(+), 4 deletions(-) create mode 100644 tools/xenlogd/io.c create mode 100644 tools/xenlogd/xenlogd.h diff --git a/tools/xenlogd/Makefile b/tools/xenlogd/Makefile index 550e914f59..0d44cd0e85 100644 --- a/tools/xenlogd/Makefile +++ b/tools/xenlogd/Makefile @@ -10,7 +10,7 @@ LDFLAGS += $(PTHREAD_LDFLAGS) TARGETS := xenlogd -XENLOGD_OBJS = xenlogd.o +XENLOGD_OBJS = xenlogd.o io.o $(XENLOGD_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(XENLOGD_OBJS): CFLAGS += $(CFLAGS_libxenevtchn) $(XENLOGD_OBJS): CFLAGS += $(CFLAGS_libxengnttab) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c new file mode 100644 index 0000000000..ef0954d69d --- /dev/null +++ b/tools/xenlogd/io.c @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * xenlogd - Xen logging daemon + * + * Copyright (C) 2023 Juergen Gross + * + * I/O thread handling. + */ + +#include +#include +#include + +#include "xenlogd.h" + +static bool io_work_pending(device *device) +{ + if ( device->stop_thread ) + return true; + return false; +} + +void *io_thread(void *arg) +{ + device *device = arg; + + while ( !device->stop_thread ) + { + pthread_mutex_lock(&device->mutex); + if ( !io_work_pending(device) ) + { + if ( xenevtchn_unmask(xe, device->evtchn) < 0 ) + syslog(LOG_WARNING, "xenevtchn_unmask() failed"); + pthread_cond_wait(&device->cond, &device->mutex); + } + pthread_mutex_unlock(&device->mutex); + + /* TODO: I/O handling. */ + } + + device->thread_active = false; + + return NULL; +} diff --git a/tools/xenlogd/xenlogd.c b/tools/xenlogd/xenlogd.c index 792d1026a3..da0a09a122 100644 --- a/tools/xenlogd/xenlogd.c +++ b/tools/xenlogd/xenlogd.c @@ -24,34 +24,562 @@ #include #include +#include +#include #include #include #include #include #include #include +#include #include #include #include -#include #include #include +#include "xenlogd.h" + +/* + * List of currently known devices. + * The list itself is modified only in the main thread. When a device is being + * removed its memory needs to be freed after the I/O thread (if existing) + * has stopped. + */ +static XEN_TAILQ_HEAD(devhead, device) devs = XEN_TAILQ_HEAD_INITIALIZER(devs); + +struct path { + char path[100]; +}; + static bool stop_me; static bool daemon_running; static struct xs_handle *xs; static xengnttab_handle *xg; -static xenevtchn_handle *xe; +static unsigned int now; + +xenevtchn_handle *xe; static void handle_stop(int sig) { stop_me = true; } +static int check_host_path(device *device) +{ + struct stat statbuf; + char *path, *p; + int ret = 1; + + if ( !device->host_path ) + return 1; + + if ( device->host_path[0] != '/' ) + return 1; + + path = strdup(device->host_path); + if ( !path ) + { + syslog(LOG_CRIT, "memory allocation failure!"); + return 1; + } + + for ( p = path; p; ) + { + p = strchr(p + 1, '/'); + if ( p ) + *p = 0; + if ( !stat(path, &statbuf) ) + { + if ( !(statbuf.st_mode & S_IFDIR) ) + break; + if ( !p ) + { + ret = 0; + break; + } + *p = '/'; + continue; + } + if ( mkdir(path, 0777) ) + break; + if ( p ) + *p = '/'; + } + + free(path); + return ret; +} + +static void construct_frontend_path(device *device, const char *node, + struct path *p) +{ + snprintf(p->path, sizeof(p->path), "/local/domain/%u/device/9pfs/%u/%s", + device->domid, device->devid, node); +} + +static void construct_backend_path(device *device, const char *node, + struct path *p) +{ + snprintf(p->path, sizeof(p->path), "backend/xen_9pfs/%u/%u/%s", + device->domid, device->devid, node); +} + +static char *read_backend_node(device *device, const char *node) +{ + struct path p; + char *val; + unsigned int len; + + construct_backend_path(device, node, &p); + val = xs_read(xs, XBT_NULL, p.path, &len); + + return val; +} + +static unsigned int uint_from_string(char *string, unsigned int def) +{ + unsigned long val; + char *end; + + if ( !string ) + return def; + + val = strtoul(string, &end, 10); + if ( *end || val > UINT_MAX ) + val = def; + free(string); + + return val; +} + +static unsigned int read_backend_node_uint(device *device, const char *node, + unsigned int def) +{ + return uint_from_string(read_backend_node(device, node), def); +} + +static unsigned int read_frontend_node_uint(device *device, const char *node, + unsigned int def) +{ + struct path p; + unsigned int len; + + construct_frontend_path(device, node, &p); + + return uint_from_string(xs_read(xs, XBT_NULL, p.path, &len), def); +} + +static int write_backend_node(device *device, const char *node, const char *val) +{ + struct path p; + struct xs_permissions perms[2] = { + { .id = 0, .perms = XS_PERM_NONE }, + { .id = device->domid, .perms = XS_PERM_READ } + }; + + construct_backend_path(device, node, &p); + if ( !xs_write(xs, XBT_NULL, p.path, val, strlen(val)) ) + { + syslog(LOG_ERR, "error writing bacḱend node \"%s\" for device %u/%u", + node, device->domid, device->devid); + return 1; + } + + if ( !xs_set_permissions(xs, XBT_NULL, p.path, perms, 2) ) + { + syslog(LOG_ERR, "error setting permissions for \"%s\"", p.path); + return 1; + } + + return 0; +} + +static int write_backend_state(device *device, enum xenbus_state state) +{ + struct path p; + char val[2]; + + snprintf(val, sizeof(val), "%u", state); + construct_backend_path(device, "state", &p); + if ( !xs_write(xs, XBT_NULL, p.path, val, 1) ) + { + syslog(LOG_ERR, "error writing backend state %u for device %u/%u", + state, device->domid, device->devid); + return 1; + } + + device->backend_state = state; + + return 0; +} + +static device *find_device(unsigned int domid, unsigned int devid) +{ + device *device; + + XEN_TAILQ_FOREACH( device, &devs, list ) + { + if ( domid == device->domid && devid == device->devid ) + return device; + } + + return NULL; +} + +static void free_device(device *device) +{ + char token[20]; + struct path p; + + construct_frontend_path(device, "state", &p); + snprintf(token, sizeof(token), "%u/%u", device->domid, device->devid); + xs_unwatch(xs, p.path, token); + + free(device->host_path); + + pthread_mutex_destroy(&device->mutex); + pthread_cond_destroy(&device->cond); + + free(device); +} + +static device *new_device(unsigned int domid, unsigned int devid) +{ + device *device; + char token[20]; + struct path p; + char *val; + + device = calloc(1, sizeof(*device)); + if ( !device ) + { + syslog(LOG_CRIT, "Got no memory for new device %u/%u", domid, devid); + return NULL; + } + + device->domid = domid; + device->devid = devid; + + construct_frontend_path(device, "state", &p); + snprintf(token, sizeof(token), "%u/%u", domid, devid); + if ( !xs_watch(xs, p.path, token) ) + { + syslog(LOG_ERR, "Setting up watch for device %u/%u failed", + domid, devid); + free(device); + return NULL; + } + + pthread_cond_init(&device->cond, NULL); + pthread_mutex_init(&device->mutex, NULL); + + val = read_backend_node(device, "security_model"); + if ( !val || strcmp(val, "none") ) + { + syslog(LOG_ERR, "Security model \"%s\" for device %u/%u invalid.", + val, domid, devid); + free(val); + goto err; + } + free(val); + + device->max_space = read_backend_node_uint(device, "max-space", 0); + device->max_files = read_backend_node_uint(device, "max-files", 0); + device->max_open_files = + read_backend_node_uint(device, "max-open-files", 0) + ?: MAX_OPEN_FILES_DEFAULT; + device->auto_delete = !!read_backend_node_uint(device, "auto-delete", 0); + + device->host_path = read_backend_node(device, "path"); + if ( check_host_path(device) ) + { + syslog(LOG_ERR, "Host path \"%s\" for device %u/%u invalid.", + device->host_path, domid, devid); + goto err; + } + + if ( write_backend_node(device, "versions", "1") ) + goto err; + if ( write_backend_node(device, "max-rings", "1") ) + goto err; + if ( write_backend_node(device, "max-ring-page-order", "9") ) + goto err; + + if ( write_backend_state(device, XenbusStateInitWait) ) + goto err; + + XEN_TAILQ_INSERT_TAIL(&devs, device, list); + syslog(LOG_INFO, "New device %u/%u added", domid, devid); + + return device; + + err: + free_device(device); + return NULL; +} + +static void disconnect_guest(device *device) +{ + if ( device->thread_active ) + { + device->stop_thread = true; + pthread_cond_signal(&device->cond); + pthread_join(device->thread, NULL); + device->stop_thread = false; + } + + if ( device->data.in ) + { + xengnttab_unmap(xg, device->data.in, 1 << device->ring_order); + device->data.in = NULL; + } + if ( device->intf ) + { + xengnttab_unmap(xg, device->intf, 1 ); + device->intf = NULL; + } + + if ( device->evtchn ) + { + xenevtchn_unbind(xe, device->evtchn); + device->evtchn = 0; + } +} + +static void close_device(device *device, enum xenbus_state state) +{ + disconnect_guest(device); + write_backend_state(device, state); +} + +static void connect_err(device *device, const char *msg) +{ + syslog(LOG_WARNING, "%s", msg); + close_device(device, XenbusStateClosed); +} + +static void connect_device(device *device) +{ + unsigned int val; + xenevtchn_port_or_error_t evtchn; + + val = read_frontend_node_uint(device, "version", 0); + if ( val != 1 ) + return connect_err(device, "frontend specifies illegal version"); + val = read_frontend_node_uint(device, "num-rings", 0); + if ( val != 1 ) + return connect_err(device, "frontend specifies illegal ring number"); + + val = read_frontend_node_uint(device, "event-channel-0", 0); + if ( val == 0 ) + return connect_err(device, "frontend specifies illegal evtchn"); + evtchn = xenevtchn_bind_interdomain(xe, device->domid, val); + if ( evtchn < 0 ) + return connect_err(device, "could not bind to event channel"); + device->evtchn = evtchn; + + val = read_frontend_node_uint(device, "ring-ref0", 0); + if ( val == 0 ) + return connect_err(device, "frontend specifies illegal grant for ring"); + device->intf = xengnttab_map_grant_ref(xg, device->domid, val, + PROT_READ | PROT_WRITE); + if ( !device->intf ) + return connect_err(device, "could not map interface page"); + device->ring_order = device->intf->ring_order; + if ( device->ring_order > 9 || device->ring_order < 1 ) + return connect_err(device, "frontend specifies illegal ring order"); + device->ring_size = XEN_FLEX_RING_SIZE(device->ring_order); + device->data.in = xengnttab_map_domain_grant_refs(xg, + 1 << device->ring_order, + device->domid, + device->intf->ref, + PROT_READ | PROT_WRITE); + if ( !device->data.in ) + return connect_err(device, "could not map ring pages"); + device->data.out = device->data.in + device->ring_size; + + if ( pthread_create(&device->thread, NULL, io_thread, device) ) + return connect_err(device, "could not start I/O thread"); + device->thread_active = true; + + write_backend_state(device, XenbusStateConnected); +} + +static void remove_device(device *device) +{ + XEN_TAILQ_REMOVE(&devs, device, list); + + disconnect_guest(device); + free_device(device); +} + +static void remove_all_devices(void) +{ + device *device, *tmp; + + XEN_TAILQ_FOREACH_SAFE( device, &devs, list, tmp ) + remove_device(device); +} + +static void frontend_changed(device *device) +{ + struct path p; + char *state, *end; + unsigned int len; + unsigned long new_state; + + construct_frontend_path(device, "state", &p); + state = xs_read(xs, XBT_NULL, p.path, &len); + if ( !state ) + { + close_device(device, XenbusStateClosed); + return; + } + + new_state = strtoul(state, &end, 10); + if ( *end || new_state > XenbusStateReconfigured ) + { + syslog(LOG_WARNING, "unknown state \"%s\" seen for device %u/%u", state, + device->domid, device->devid); + new_state = XenbusStateUnknown; + } + free(state); + + if ( new_state == device->frontend_state ) + return; + + switch ( new_state ) + { + case XenbusStateInitialising: + break; + + case XenbusStateInitialised: + connect_device(device); + break; + + case XenbusStateConnected: + break; + + case XenbusStateClosing: + close_device(device, XenbusStateClosing); + break; + + case XenbusStateClosed: + close_device(device, XenbusStateClosed); + break; + + default: + syslog(LOG_WARNING, "not handled frontend state %lu for device %u/%u", + new_state, device->domid, device->devid); + break; + } + + device->frontend_state = new_state; +} + +static void check_device(unsigned int domid, unsigned int devid) +{ + device *device; + + device = find_device(domid, devid); + if ( !device ) + { + device = new_device(domid, devid); + if ( !device ) + return; + } + + device->last_seen = now; +} + +static void scan_backend(void) +{ + char **doms; + unsigned int n_doms, dom; + char **devices; + unsigned int n_devs, dev; + char dom_path[24]; + unsigned long domid, devid; + char *end; + device *device, *tmp; + + now++; + + doms = xs_directory(xs, XBT_NULL, "backend/xen_9pfs", &n_doms); + if ( doms == NULL ) + return; + + for ( dom = 0; dom < n_doms; dom++ ) + { + errno = 0; + domid = strtoul(doms[dom], &end, 10); + if ( errno || *end || domid >= DOMID_FIRST_RESERVED ) + continue; + + snprintf(dom_path, sizeof(dom_path), "backend/xen_9pfs/%lu", domid); + devices = xs_directory(xs, XBT_NULL, dom_path, &n_devs); + + for ( dev = 0; dev < n_devs; dev++ ) + { + errno = 0; + devid = strtoul(devices[dev], &end, 10); + if ( errno || *end || devid > UINT_MAX ) + continue; + + check_device(domid, devid); + } + + free(devices); + } + + free(doms); + + XEN_TAILQ_FOREACH_SAFE( device, &devs, list, tmp ) + { + if ( device->last_seen != now ) + remove_device(device); + } +} + +static void handle_watch(char *path, char *token) +{ + unsigned int domid, devid; + device *device; + + if ( !strcmp(token, "main") ) + { + scan_backend(); + return; + } + + if ( sscanf(token, "%u/%u", &domid, &devid) != 2 ) + { + syslog(LOG_WARNING, "unknown watch event %s %s", path, token); + return; + } + + device = find_device(domid, devid); + if ( !device ) + { + syslog(LOG_WARNING, "watch event for unknown device %u/%u", + domid, devid); + return; + } + + frontend_changed(device); +} + static void close_all(void) { if ( daemon_running ) + { xs_rm(xs, XBT_NULL, "/tool/xenlog"); + xs_unwatch(xs, "backend/xen_9pfs", "main"); + + remove_all_devices(); + } if ( xe ) xenevtchn_close(xe); if ( xg ) @@ -68,6 +596,25 @@ static void do_err(const char *msg) exit(1); } +static void handle_event(void) +{ + xenevtchn_port_or_error_t evtchn; + device *device; + + evtchn = xenevtchn_pending(xe); + if ( evtchn < 0 ) + do_err("xenevtchn_pending() failed"); + + XEN_TAILQ_FOREACH( device, &devs, list ) + { + if ( device->evtchn == evtchn ) + { + pthread_cond_signal(&device->cond); + break; + } + } +} + static void xen_connect(void) { xs_transaction_t t; @@ -122,6 +669,11 @@ int main(int argc, char *argv[]) int syslog_mask = LOG_MASK(LOG_WARNING) | LOG_MASK(LOG_ERR) | LOG_MASK(LOG_CRIT) | LOG_MASK(LOG_ALERT) | LOG_MASK(LOG_EMERG); + char **watch; + struct pollfd p[2] = { + { .events = POLLIN, .revents = POLLIN }, + { .events = POLLIN } + }; umask(027); if ( getenv("XENLOGD_VERBOSE") ) @@ -134,9 +686,26 @@ int main(int argc, char *argv[]) xen_connect(); + if ( !xs_watch(xs, "backend/xen_9pfs", "main") ) + do_err("xs_watch() in main thread failed"); + p[0].fd = xs_fileno(xs); + p[1].fd = xenevtchn_fd(xe); + + scan_backend(); + while ( !stop_me ) { - sleep(60); + while ( (p[0].revents & POLLIN) && + (watch = xs_check_watch(xs)) != NULL ) + { + handle_watch(watch[XS_WATCH_PATH], watch[XS_WATCH_TOKEN]); + free(watch); + } + + if ( p[1].revents & POLLIN ) + handle_event(); + + poll(p, 2, 10000); } close_all(); diff --git a/tools/xenlogd/xenlogd.h b/tools/xenlogd/xenlogd.h new file mode 100644 index 0000000000..a8e9f9ca22 --- /dev/null +++ b/tools/xenlogd/xenlogd.h @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef XENLOGD_H +#define XENLOGD_H + +#include +#include +#include +#include +#include +#include +#include + +#define MAX_OPEN_FILES_DEFAULT 5 + +typedef struct device device; +struct device { + /* Admin data. */ + XEN_TAILQ_ENTRY(device) list; + unsigned int last_seen; /* Set in scan_backend(). */ + unsigned int domid; + unsigned int devid; + bool thread_active; + bool stop_thread; + pthread_t thread; + pthread_cond_t cond; + pthread_mutex_t mutex; + + /* Tool side configuration data. */ + char *host_path; + unsigned int max_space; + unsigned int max_files; + unsigned int max_open_files; + bool auto_delete; + + /* Connection data. */ + enum xenbus_state backend_state; + enum xenbus_state frontend_state; + evtchn_port_t evtchn; + struct xen_9pfs_data_intf *intf; + unsigned int ring_order; + RING_IDX ring_size; + struct xen_9pfs_data data; +}; + +extern xenevtchn_handle *xe; + +void *io_thread(void *arg); + +#endif /* XENLOGD_H */ From patchwork Wed Nov 1 09:33:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442671 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 4BA53C4167B for ; Wed, 1 Nov 2023 09:34:08 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626241.976349 (Exim 4.92) (envelope-from ) id 1qy7bl-0007T0-Aj; Wed, 01 Nov 2023 09:33:53 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626241.976349; Wed, 01 Nov 2023 09:33:53 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7bl-0007Sp-6X; Wed, 01 Nov 2023 09:33:53 +0000 Received: by outflank-mailman (input) for mailman id 626241; Wed, 01 Nov 2023 09:33:52 +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 1qy7bk-0005E0-0o for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:33:52 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id c4480c77-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:33:51 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 318C521835; Wed, 1 Nov 2023 09:33:51 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 0901713460; Wed, 1 Nov 2023 09:33:51 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id XsLtAH8bQmW9CAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:33:51 +0000 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: c4480c77-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831231; h=from:from:reply-to: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=SG/cdYRJD2CfQyplx7RLCTyqvUsFZjaC4L9HFaUzmyI=; b=nm1HWMddpIPSTRB10ydlf/RkKXoJxNeTkikN2LhqLodq01RH9XEpFhbfwd7IHKrIwXP3/I OCcbXvctBNWeutYYOsT4P0KQVRBc/b4X/lpnulacS3+VhvGgJfOrEeWtw2Ks2XcDKqagp0 vsrONSBNwhNZk4AT6QOhUGKSA4tJw0Y= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 04/29] tools/xenlogd: add transport layer Date: Wed, 1 Nov 2023 10:33:00 +0100 Message-Id: <20231101093325.30302-5-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the transport layer of 9pfs. This is basically the infrastructure to receive requests from the frontend and to send the related answers via the rings. In order to avoid unaligned accesses e.g. on Arm, add the definition of __packed to the common-macros.h header. Signed-off-by: Juergen Gross --- tools/include/xen-tools/common-macros.h | 4 + tools/xenlogd/io.c | 142 +++++++++++++++++++++++- tools/xenlogd/xenlogd.h | 16 +++ 3 files changed, 160 insertions(+), 2 deletions(-) diff --git a/tools/include/xen-tools/common-macros.h b/tools/include/xen-tools/common-macros.h index e5ed603904..c3fd7d2a30 100644 --- a/tools/include/xen-tools/common-macros.h +++ b/tools/include/xen-tools/common-macros.h @@ -79,6 +79,10 @@ #define __must_check __attribute__((__warn_unused_result__)) #endif +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif + #define container_of(ptr, type, member) ({ \ typeof(((type *)0)->member) *mptr__ = (ptr); \ (type *)((char *)mptr__ - offsetof(type, member)); \ diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index ef0954d69d..590d06e906 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -6,24 +6,115 @@ * Copyright (C) 2023 Juergen Gross * * I/O thread handling. + * + * Only handle one request at a time, pushing out the complete response + * before looking for the next request. */ #include +#include #include #include +#include /* For cpu barriers. */ +#include #include "xenlogd.h" +/* + * Note that the ring names "in" and "out" are from the frontend's + * perspective, so the "in" ring will be used for responses to the frontend, + * while the "out" ring is used for requests from the frontend to the + * backend. + */ +static unsigned int ring_in_free(device *device) +{ + unsigned int queued; + + queued = xen_9pfs_queued(device->prod_pvt_in, device->intf->in_cons, + device->ring_size); + xen_rmb(); + + return device->ring_size - queued; +} + +static unsigned int ring_out_data(device *device) +{ + unsigned int queued; + + queued = xen_9pfs_queued(device->intf->out_prod, device->cons_pvt_out, + device->ring_size); + xen_rmb(); + + return queued; +} + +static unsigned int get_request_bytes(device *device, unsigned int off, + unsigned int len) +{ + unsigned int size; + unsigned int out_data = ring_out_data(device); + RING_IDX prod, cons; + + size = min(len - off, out_data); + prod = xen_9pfs_mask(device->intf->out_prod, device->ring_size); + cons = xen_9pfs_mask(device->cons_pvt_out, device->ring_size); + xen_9pfs_read_packet(device->buffer + off, device->data.out, size, + prod, &cons, device->ring_size); + + xen_rmb(); /* Read data out before setting visible consumer. */ + device->cons_pvt_out += size; + device->intf->out_cons = device->cons_pvt_out; + + /* Signal that more space is available now. */ + xenevtchn_notify(xe, device->evtchn); + + return size; +} + +static unsigned int put_request_bytes(device *device, unsigned int off, + unsigned int len) +{ + unsigned int size; + unsigned int in_data = ring_in_free(device); + RING_IDX prod, cons; + + size = min(len - off, in_data); + prod = xen_9pfs_mask(device->prod_pvt_in, device->ring_size); + cons = xen_9pfs_mask(device->intf->in_cons, device->ring_size); + xen_9pfs_write_packet(device->data.in, device->buffer + off, size, + &prod, cons, device->ring_size); + + xen_wmb(); /* Write data out before setting visible producer. */ + device->prod_pvt_in += size; + device->intf->in_prod = device->prod_pvt_in; + + return size; +} + static bool io_work_pending(device *device) { if ( device->stop_thread ) return true; - return false; + if ( device->error ) + return false; + return device->handle_response ? ring_in_free(device) + : ring_out_data(device); } void *io_thread(void *arg) { device *device = arg; + unsigned int count = 0; + struct p9_header hdr; + bool in_hdr = true; + + device->max_size = device->ring_size; + device->buffer = malloc(device->max_size); + if ( !device->buffer ) + { + syslog(LOG_CRIT, "memory allocation failure!"); + return NULL; + } while ( !device->stop_thread ) { @@ -36,9 +127,56 @@ void *io_thread(void *arg) } pthread_mutex_unlock(&device->mutex); - /* TODO: I/O handling. */ + if ( device->stop_thread || device->error ) + continue; + + if ( !device->handle_response ) + { + if ( in_hdr ) + { + count += get_request_bytes(device, count, sizeof(hdr)); + if ( count != sizeof(hdr) ) + continue; + hdr = *(struct p9_header *)device->buffer; + if ( hdr.size > device->max_size || hdr.size < sizeof(hdr) ) + { + syslog(LOG_ERR, "%u.%u specified illegal request length %u", + device->domid, device->devid, hdr.size); + device->error = true; + continue; + } + in_hdr = false; + } + + count += get_request_bytes(device, count, hdr.size); + if ( count < hdr.size ) + continue; + + /* TODO: handle request. */ + + device->handle_response = true; + hdr.size = ((struct p9_header *)device->buffer)->size; + count = 0; + } + + if ( device->handle_response ) + { + count += put_request_bytes(device, count, hdr.size); + + if ( count == hdr.size ) + { + /* Signal presence of response. */ + xenevtchn_notify(xe, device->evtchn); + + device->handle_response = false; + in_hdr = true; + count = 0; + } + } } + free(device->buffer); + device->thread_active = false; return NULL; diff --git a/tools/xenlogd/xenlogd.h b/tools/xenlogd/xenlogd.h index a8e9f9ca22..40aa7cd03a 100644 --- a/tools/xenlogd/xenlogd.h +++ b/tools/xenlogd/xenlogd.h @@ -13,6 +13,12 @@ #define MAX_OPEN_FILES_DEFAULT 5 +struct p9_header { + uint32_t size; + uint8_t cmd; + uint16_t tag; +} __attribute__((packed)); + typedef struct device device; struct device { /* Admin data. */ @@ -40,7 +46,17 @@ struct device { struct xen_9pfs_data_intf *intf; unsigned int ring_order; RING_IDX ring_size; + + /* Transport layer data. */ struct xen_9pfs_data data; + RING_IDX prod_pvt_in; + RING_IDX cons_pvt_out; + + /* Request and response handling. */ + uint32_t max_size; + bool error; /* Protocol error - stop processing. */ + bool handle_response; /* Main loop now handling response. */ + void *buffer; /* Request/response buffer. */ }; extern xenevtchn_handle *xe; From patchwork Wed Nov 1 09:33:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442670 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 2B1B1C4332F for ; Wed, 1 Nov 2023 09:34:08 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626243.976359 (Exim 4.92) (envelope-from ) id 1qy7br-0007yD-HP; Wed, 01 Nov 2023 09:33:59 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626243.976359; Wed, 01 Nov 2023 09:33:59 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7br-0007y4-Dv; Wed, 01 Nov 2023 09:33:59 +0000 Received: by outflank-mailman (input) for mailman id 626243; Wed, 01 Nov 2023 09:33:57 +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 1qy7bp-0005E0-Mr for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:33:57 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id c79872cf-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:33:57 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B9FBB1F74A; Wed, 1 Nov 2023 09:33:56 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 9053313460; Wed, 1 Nov 2023 09:33:56 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id R162IYQbQmXDCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:33:56 +0000 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: c79872cf-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831236; h=from:from:reply-to: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=9twQoG8Ni5j7s6nNRlwgs8V2w4vbElXCXWFZkZ1OasA=; b=fVRInW4p0CstzpGkfVb6dpeZF9twhiYqF0nnpSnCxFEUfdj2kjR+AayNgF65z20uKO6ZvZ SYY23ROOirCYGHcypuQfl0tdWn5B3Guoxzmn3fNORbOiL/gvU+jOJc3+kDDEZrE7r0RAAo C+WD1T9gtgrW2+LuzoPqCyzoAd1hyDA= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 05/29] tools/xenlogd: add 9pfs response generation support Date: Wed, 1 Nov 2023 10:33:01 +0100 Message-Id: <20231101093325.30302-6-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add support for generation a 9pfs protocol response via a format based approach. Strings are stored in a per device string buffer and they are referenced via their offset in this buffer. This allows to avoid having to dynamically allocate memory for each single string. As a first user of the response handling add a generic p9_error() function which will be used to return any error to the client. Add all format parsing variants in order to avoid additional code churn later when adding the users of those variants. Prepare a special case for the "read" case already (format character 'D'): in order to avoid adding another buffer for read data support doing the read I/O directly into the response buffer. Signed-off-by: Juergen Gross --- tools/xenlogd/io.c | 189 +++++++++++++++++++++++++++++++++++++++- tools/xenlogd/xenlogd.h | 3 + 2 files changed, 191 insertions(+), 1 deletion(-) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 590d06e906..5a06f72338 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -11,6 +11,7 @@ * before looking for the next request. */ +#include #include #include #include @@ -20,6 +21,16 @@ #include "xenlogd.h" +/* P9 protocol commands (response is either cmd+1 or P9_CMD_ERROR). */ +#define P9_CMD_ERROR 107 + +struct p9_qid { + uint8_t type; +#define QID_TYPE_DIR 0x80 + uint32_t version; + uint64_t path; +}; + /* * Note that the ring names "in" and "out" are from the frontend's * perspective, so the "in" ring will be used for responses to the frontend, @@ -101,6 +112,172 @@ static bool io_work_pending(device *device) : ring_out_data(device); } +static void fmt_err(const char *fmt) +{ + syslog(LOG_CRIT, "illegal format %s passed to fill_buffer()", fmt); + exit(1); +} + +/* + * Fill buffer with response data. + * fmt is a sequence of format characters. Supported characters are: + * a: an array (2 bytes number of elements + the following format as elements) + * The number of elements is passed in the first unsigned int parameter, the + * next parameter is a pointer to an array of elements as denoted by the next + * format character. + * b: 2 byte unsigned integer + * The parameter is a pointer to a uint16_t value + * D: Data blob (4 byte length + bytes) + * 2 parameters are consumed, first an unsigned int for the length, then a + * pointer to the first uint8_t value. + * No array support. + * L: 8 byte unsigned integer + * The parameter is a pointer to a uint64_t value + * Q: Qid (struct p9_qid) + * S: String (2 byte length + characters) + * The length is obtained via strlen() of the parameter, being a pointer + * to the first character of the string + * U: 4 byte unsigned integer + * The parameter is a pointer to a uint32_t value + */ +static void fill_buffer(device *device, uint8_t cmd, uint16_t tag, + const char *fmt, ...) +{ + struct p9_header *hdr = device->buffer; + void *data = hdr + 1; + const char *f; + const void *par; + const char *str_val; + const struct p9_qid *qid; + unsigned int len; + va_list ap; + unsigned int array_sz = 0; + unsigned int elem_sz = 0; + + hdr->cmd = cmd; + hdr->tag = tag; + + va_start(ap, fmt); + + for ( f = fmt; *f; f++ ) + { + if ( !array_sz ) + par = va_arg(ap, const void *); + else + { + par += elem_sz; + array_sz--; + } + + switch ( *f ) + { + case 'a': + f++; + if ( !*f || array_sz ) + fmt_err(fmt); + array_sz = *(const unsigned int *)par; + *(__packed uint16_t *)data = array_sz; + data += sizeof(uint16_t); + par = va_arg(ap, const void *); + elem_sz = 0; + break; + + case 'u': + *(__packed uint16_t *)data = *(const uint16_t *)par; + elem_sz = sizeof(uint16_t); + data += sizeof(uint16_t); + break; + + case 'D': + if ( array_sz ) + fmt_err(fmt); + len = *(const unsigned int *)par; + *(__packed uint32_t *)data = len; + data += sizeof(uint32_t); + par = va_arg(ap, const void *); + if ( data != par ) + memcpy(data, par, len); + data += len; + break; + + case 'L': + *(__packed uint64_t *)data = *(const uint64_t *)par; + elem_sz = sizeof(uint64_t); + data += sizeof(uint64_t); + break; + + case 'Q': + qid = par; + elem_sz = sizeof(*qid); + *(uint8_t *)data = qid->type; + data += sizeof(uint8_t); + *(__packed uint32_t *)data = qid->version; + data += sizeof(uint32_t); + *(__packed uint64_t *)data = qid->path; + data += sizeof(uint64_t); + break; + + case 'S': + str_val = par; + elem_sz = sizeof(str_val); + len = strlen(str_val); + *(__packed uint16_t *)data = len; + data += sizeof(uint16_t); + memcpy(data, str_val, len); + data += len; + break; + + case 'U': + *(__packed uint32_t *)data = *(const uint32_t *)par; + elem_sz = sizeof(uint32_t); + data += sizeof(uint32_t); + break; + + default: + fmt_err(fmt); + } + + if ( array_sz ) + f--; + } + + hdr->size = data - device->buffer; +} + +static unsigned int add_string(device *device, const char *str, + unsigned int len) +{ + char *tmp; + unsigned int ret; + + if ( device->str_used + len + 1 > device->str_size ) + { + tmp = realloc(device->str, device->str_used + len + 1); + if ( !tmp ) + return ~0; + device->str = tmp; + device->str_size = device->str_used + len + 1; + } + + ret = device->str_used; + memcpy(device->str + ret, str, len); + device->str_used += len; + device->str[device->str_used++] = 0; + + return ret; +} + +static void p9_error(device *device, uint16_t tag, uint32_t err) +{ + unsigned int erroff; + + strerror_r(err, device->buffer, device->ring_size); + erroff = add_string(device, device->buffer, strlen(device->buffer)); + fill_buffer(device, P9_CMD_ERROR, tag, "SU", + erroff != ~0 ? device->str + erroff : "cannot allocate memory", + &err); +} + void *io_thread(void *arg) { device *device = arg; @@ -152,7 +329,16 @@ void *io_thread(void *arg) if ( count < hdr.size ) continue; - /* TODO: handle request. */ + device->str_used = 0; + + switch ( hdr.cmd ) + { + default: + syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", + device->domid, device->devid, hdr.cmd); + p9_error(device, hdr.tag, EOPNOTSUPP); + break; + } device->handle_response = true; hdr.size = ((struct p9_header *)device->buffer)->size; @@ -175,6 +361,7 @@ void *io_thread(void *arg) } } + free(device->str); free(device->buffer); device->thread_active = false; diff --git a/tools/xenlogd/xenlogd.h b/tools/xenlogd/xenlogd.h index 40aa7cd03a..c10c6aa9e5 100644 --- a/tools/xenlogd/xenlogd.h +++ b/tools/xenlogd/xenlogd.h @@ -57,6 +57,9 @@ struct device { bool error; /* Protocol error - stop processing. */ bool handle_response; /* Main loop now handling response. */ void *buffer; /* Request/response buffer. */ + char *str; /* String work space. */ + unsigned int str_size; /* Size of *str. */ + unsigned int str_used; /* Currently used size of *str. */ }; extern xenevtchn_handle *xe; From patchwork Wed Nov 1 09:33:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442707 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 E01AAC4332F for ; Wed, 1 Nov 2023 09:54:44 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626350.976579 (Exim 4.92) (envelope-from ) id 1qy7vg-0000xl-Fd; Wed, 01 Nov 2023 09:54:28 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626350.976579; Wed, 01 Nov 2023 09:54:28 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7vg-0000xa-Ck; Wed, 01 Nov 2023 09:54:28 +0000 Received: by outflank-mailman (input) for mailman id 626350; Wed, 01 Nov 2023 09:54:27 +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 1qy7bv-0005E0-2e for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:03 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id cae43050-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:02 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 4774421846; Wed, 1 Nov 2023 09:34:02 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 2327213460; Wed, 1 Nov 2023 09:34:02 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 374jB4obQmXQCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:02 +0000 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: cae43050-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831242; h=from:from:reply-to: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=kBmsQtp57emfLwa80o+3o5PurxmvQSyXJw17w10lPio=; b=oNIkwTdSrd7eakjTUaDxm9TYv5We1x+YcQXJJIeeR03V6ONKrS5/fLnvZnRlcgvlND6g2Q 2iHw+fm//VaXvm1Z8Ox5MDINx+T16ZtMrRlpwqrOK54oleoyUR9eXFPwJSMs7bZ5BFiJ4J Oe1A2gu7l4ufezW0fyfPRAG5+p70X1g= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 06/29] tools/xenlogd: add 9pfs version request support Date: Wed, 1 Nov 2023 10:33:02 +0100 Message-Id: <20231101093325.30302-7-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the version request of the 9pfs protocol. For the version use the "9P2000.u" variant, as it is supported by Mini-OS and Linux. For the request parsing add all format items needed even in future in order to avoid code churn for those additions later. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenlogd/io.c | 202 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 5a06f72338..f35520018f 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -22,8 +22,12 @@ #include "xenlogd.h" /* P9 protocol commands (response is either cmd+1 or P9_CMD_ERROR). */ +#define P9_CMD_VERSION 100 #define P9_CMD_ERROR 107 +#define P9_MIN_MSIZE 2048 +#define P9_VERSION "9P2000.u" + struct p9_qid { uint8_t type; #define QID_TYPE_DIR 0x80 @@ -267,6 +271,169 @@ static unsigned int add_string(device *device, const char *str, return ret; } +static bool chk_data(device *device, void *data, unsigned int len) +{ + struct p9_header *hdr = device->buffer; + + if ( data + len <= device->buffer + hdr->size ) + return true; + + errno = E2BIG; + + return false; +} + +static bool fill_data_elem(void **par, void **array, unsigned int *array_sz, + unsigned int elem_sz, void *data) +{ + if ( *array_sz && !*array ) + { + *array = calloc(*array_sz, elem_sz); + if ( !*array ) + return false; + *par = *array; + } + + memcpy(*par, data, elem_sz); + + if ( *array_sz ) + { + *par += elem_sz; + *array_sz -= 1; + } + + return true; +} + +/* + * Fill variables with request data. + * fmt is a sequence of format characters. Supported characters are: + * a: an array (2 bytes number of elements + the following format as elements) + * The number of elements is stored in the first unsigned int parameter, the + * next parameter is a pointer to an array of elements as denoted by the next + * format character. The array is allocated dynamically. + * b: 1 byte unsigned integer + * The value is stored in the next parameter with type uint8_t. + * D: Data blob (4 byte length + bytes) + * 2 parameters are consumed, first an unsigned int for the length, then a + * pointer to the first uint8_t value. + * No array support. + * L: 8 byte unsigned integer + * The value is stored in the next parameter with type uint64_t. + * S: String (2 byte length + characters) + * The 0-terminated string is stored in device->str + off, off is stored in + * the next parameter with type unsigned int. + * U: 4 byte unsigned integer + * The value is stored in the next parameter with type uint32_t. + * + * Return value: number of filled variables, errno will be set in case of + * error. + */ +static int fill_data(device *device, const char *fmt, ...) +{ + struct p9_header *hdr = device->buffer; + void *data = hdr + 1; + void *par; + unsigned int pars = 0; + const char *f; + va_list ap; + unsigned int len; + unsigned int str_off; + unsigned int array_sz = 0; + void **array = NULL; + + va_start(ap, fmt); + + for ( f = fmt; *f; f++ ) + { + if ( !array_sz ) + par = va_arg(ap, void *); + + switch ( *f ) + { + case 'a': + f++; + if ( !*f || array_sz ) + fmt_err(fmt); + if ( !chk_data(device, data, sizeof(uint16_t)) ) + return pars; + array_sz = *(__packed uint16_t *)data; + data += sizeof(uint16_t); + *(unsigned int *)par = array_sz; + array = va_arg(ap, void **); + *array = NULL; + break; + + case 'b': + if ( !chk_data(device, data, sizeof(uint8_t)) ) + return pars; + if ( !fill_data_elem(&par, array, &array_sz, sizeof(uint8_t), + data) ) + return pars; + data += sizeof(uint8_t); + break; + + case 'D': + if ( array_sz ) + fmt_err(fmt); + if ( !chk_data(device, data, sizeof(uint32_t)) ) + return pars; + len = *(__packed uint32_t *)data; + data += sizeof(uint32_t); + *(unsigned int *)par = len; + par = va_arg(ap, void *); + if ( !chk_data(device, data, len) ) + return pars; + memcpy(par, data, len); + data += len; + break; + + case 'L': + if ( !chk_data(device, data, sizeof(uint64_t)) ) + return pars; + if ( !fill_data_elem(&par, array, &array_sz, sizeof(uint64_t), + data) ) + return pars; + data += sizeof(uint64_t); + break; + + case 'S': + if ( !chk_data(device, data, sizeof(uint16_t)) ) + return pars; + len = *(__packed uint16_t *)data; + data += sizeof(uint16_t); + if ( !chk_data(device, data, len) ) + return pars; + str_off = add_string(device, data, len); + if ( str_off == ~0 ) + return pars; + if ( !fill_data_elem(&par, array, &array_sz, sizeof(unsigned int), + &str_off) ) + return pars; + data += len; + break; + + case 'U': + if ( !chk_data(device, data, sizeof(uint32_t)) ) + return pars; + if ( !fill_data_elem(&par, array, &array_sz, sizeof(uint32_t), + data) ) + return pars; + data += sizeof(uint32_t); + break; + + default: + fmt_err(fmt); + } + + if ( array_sz ) + f--; + pars++; + } + + return pars; +} + static void p9_error(device *device, uint16_t tag, uint32_t err) { unsigned int erroff; @@ -278,6 +445,37 @@ static void p9_error(device *device, uint16_t tag, uint32_t err) &err); } +static void p9_version(device *device, struct p9_header *hdr) +{ + uint32_t max_size; + unsigned int off; + char *version; + int ret; + + ret = fill_data(device, "US", &max_size, &off); + if ( ret != 2 ) + { + p9_error(device, hdr->tag, errno); + return; + } + + if ( max_size < P9_MIN_MSIZE ) + { + p9_error(device, hdr->tag, EMSGSIZE); + return; + } + + if ( max_size < device->max_size ) + device->max_size = max_size; + + version = device->str + off; + if ( strcmp(version, P9_VERSION) ) + version = "unknown"; + + fill_buffer(device, hdr->cmd + 1, hdr->tag, "US", &device->max_size, + version); +} + void *io_thread(void *arg) { device *device = arg; @@ -333,6 +531,10 @@ void *io_thread(void *arg) switch ( hdr.cmd ) { + case P9_CMD_VERSION: + p9_version(device, &hdr); + break; + default: syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", device->domid, device->devid, hdr.cmd); From patchwork Wed Nov 1 09:33:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442708 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 EC3A3C4332F for ; Wed, 1 Nov 2023 09:54:57 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626357.976599 (Exim 4.92) (envelope-from ) id 1qy7vw-0002Cr-8Q; Wed, 01 Nov 2023 09:54:44 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626357.976599; Wed, 01 Nov 2023 09:54:44 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7vw-0002Ck-4y; Wed, 01 Nov 2023 09:54:44 +0000 Received: by outflank-mailman (input) for mailman id 626357; Wed, 01 Nov 2023 09:54:43 +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 1qy7c0-0005E0-LA for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:08 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [2001:67c:2178:6::1c]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id ce330d39-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:08 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id CCAC721846; Wed, 1 Nov 2023 09:34:07 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id A8A4513460; Wed, 1 Nov 2023 09:34:07 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id DT/6J48bQmXfCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:07 +0000 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: ce330d39-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831247; h=from:from:reply-to: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=clPD8bKrjSItRh9+J5fvt9orEmlHmagPq1GlV/FwboY=; b=D9zW62sR92TOA5HFFrtOsYmlL7GuRQ/rDUKePCyhjT1JNbadVW38EdE/kU/aKfH4t3VnLt abq5QUf/XX4358xfp4zwFWDK2UIhGDqZvlc/Le4idc0kx/9ehwPKBGBOyy6UWX2ZyMJ7aO 86Ean3ncbL739Wv611m+LwA+2+3gKmE= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 07/29] tools/xenlogd: add 9pfs attach request support Date: Wed, 1 Nov 2023 10:33:03 +0100 Message-Id: <20231101093325.30302-8-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the attach request of the 9pfs protocol. This introduces the "fid" scheme of the 9pfs protocol. As this will be needed later, use a dedicated memory allocation function in alloc_fid(). For filling the qid data take the approach from the qemu 9pfs backend implementation. Signed-off-by: Juergen Gross --- tools/xenlogd/io.c | 128 ++++++++++++++++++++++++++++++++++++++++ tools/xenlogd/xenlogd.c | 1 + tools/xenlogd/xenlogd.h | 11 ++++ 3 files changed, 140 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index f35520018f..fa825c9f39 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include /* For cpu barriers. */ #include @@ -23,6 +25,7 @@ /* P9 protocol commands (response is either cmd+1 or P9_CMD_ERROR). */ #define P9_CMD_VERSION 100 +#define P9_CMD_ATTACH 104 #define P9_CMD_ERROR 107 #define P9_MIN_MSIZE 2048 @@ -434,6 +437,92 @@ static int fill_data(device *device, const char *fmt, ...) return pars; } +static struct p9_fid *find_fid(device *device, unsigned int fid) +{ + struct p9_fid *fidp; + + XEN_TAILQ_FOREACH(fidp, &device->fids, list) + { + if ( fidp->fid == fid ) + return fidp; + } + + return NULL; +} + +static struct p9_fid *alloc_fid_mem(device *device, unsigned int fid, + const char *path) +{ + struct p9_fid *fidp; + size_t pathlen; + + pathlen = strlen(device->host_path) + strlen(path) + 1; + fidp = calloc(sizeof(*fidp) + pathlen, 1); + if ( !fidp ) + return NULL; + + fidp->fid = fid; + snprintf(fidp->path, pathlen, "%s%s", device->host_path, path); + + return fidp; +} + +static struct p9_fid *alloc_fid(device *device, unsigned int fid, + const char *path) +{ + struct p9_fid *fidp; + + if ( find_fid(device, fid) ) + { + errno = EBADFD; + return NULL; + } + + if ( device->n_fids >= device->max_open_files ) + { + errno = EMFILE; + return NULL; + } + + fidp = alloc_fid_mem(device, fid, path); + if ( !fidp ) + return NULL; + + XEN_TAILQ_INSERT_HEAD(&device->fids, fidp, list); + device->n_fids++; + + return fidp; +} + +static void free_fid(device *device, struct p9_fid *fidp) +{ + if ( !fidp ) + return; + + device->n_fids--; + XEN_TAILQ_REMOVE(&device->fids, fidp, list); + free(fidp); +} + +static int fill_qid(const char *path, struct p9_qid *qid, struct stat *stbuf) +{ + struct stat st; + + if ( !stbuf ) + { + if ( stat(path, &st) ) + return errno; + + stbuf = &st; + } + + qid->type = S_ISDIR(stbuf->st_mode) ? QID_TYPE_DIR : 0; + qid->version = stbuf->st_mtime ^ (stbuf->st_size << 8); + qid->path = stbuf->st_ino; + + return 0; +} + static void p9_error(device *device, uint16_t tag, uint32_t err) { unsigned int erroff; @@ -476,6 +565,41 @@ static void p9_version(device *device, struct p9_header *hdr) version); } +static void p9_attach(device *device, struct p9_header *hdr) +{ + uint32_t fid; + uint32_t dummy_u32; + unsigned int dummy_uint; + struct p9_qid qid; + int ret; + + ret = fill_data(device, "UUSSU", &fid, &dummy_u32, &dummy_uint, &dummy_uint, + &dummy_u32); + if ( ret != 5 ) + { + p9_error(device, hdr->tag, errno); + return; + } + + device->root_fid = alloc_fid(device, fid, ""); + if ( !device->root_fid ) + { + p9_error(device, hdr->tag, errno); + return; + } + + ret = fill_qid(device->host_path, &qid, NULL); + if ( ret ) + { + free_fid(device, device->root_fid); + device->root_fid = NULL; + p9_error(device, hdr->tag, ret); + return; + } + + fill_buffer(device, hdr->cmd + 1, hdr->tag, "Q", &qid); +} + void *io_thread(void *arg) { device *device = arg; @@ -535,6 +659,10 @@ void *io_thread(void *arg) p9_version(device, &hdr); break; + case P9_CMD_ATTACH: + p9_attach(device, &hdr); + break; + default: syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", device->domid, device->devid, hdr.cmd); diff --git a/tools/xenlogd/xenlogd.c b/tools/xenlogd/xenlogd.c index da0a09a122..d2de7bfbf2 100644 --- a/tools/xenlogd/xenlogd.c +++ b/tools/xenlogd/xenlogd.c @@ -274,6 +274,7 @@ static device *new_device(unsigned int domid, unsigned int devid) pthread_cond_init(&device->cond, NULL); pthread_mutex_init(&device->mutex, NULL); + XEN_TAILQ_INIT(&device->fids); val = read_backend_node(device, "security_model"); if ( !val || strcmp(val, "none") ) diff --git a/tools/xenlogd/xenlogd.h b/tools/xenlogd/xenlogd.h index c10c6aa9e5..bd2a283ccb 100644 --- a/tools/xenlogd/xenlogd.h +++ b/tools/xenlogd/xenlogd.h @@ -19,6 +19,12 @@ struct p9_header { uint16_t tag; } __attribute__((packed)); +struct p9_fid { + XEN_TAILQ_ENTRY(struct p9_fid) list; + unsigned int fid; + char path[]; +}; + typedef struct device device; struct device { /* Admin data. */ @@ -60,6 +66,11 @@ struct device { char *str; /* String work space. */ unsigned int str_size; /* Size of *str. */ unsigned int str_used; /* Currently used size of *str. */ + + /* File system handling. */ + XEN_TAILQ_HEAD(fidhead, struct p9_fid) fids; + struct p9_fid *root_fid; + unsigned int n_fids; }; extern xenevtchn_handle *xe; From patchwork Wed Nov 1 09:33:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442703 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 8055EC4332F for ; Wed, 1 Nov 2023 09:53:42 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626340.976548 (Exim 4.92) (envelope-from ) id 1qy7un-0007Sz-MI; Wed, 01 Nov 2023 09:53:33 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626340.976548; Wed, 01 Nov 2023 09:53:33 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7un-0007Sq-JL; Wed, 01 Nov 2023 09:53:33 +0000 Received: by outflank-mailman (input) for mailman id 626340; Wed, 01 Nov 2023 09:53:32 +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 1qy7c6-0005E0-6O for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:14 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id d184bd93-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:13 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 616E321835; Wed, 1 Nov 2023 09:34:13 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 39BD013460; Wed, 1 Nov 2023 09:34:13 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 5hiwDJUbQmXrCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:13 +0000 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: d184bd93-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831253; h=from:from:reply-to: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=gBtgEznE3KEIFlMuwgPzeNll8kGnCvvkfUEy+BMKjGU=; b=E79bkSFrWNdKh7v9dMQ/SODnwbbLirN6Q7anPPTi/s3hVHOybayJkUzdG5d2oFK5RO3e9w ofRxMPDgFC+NWgEminjw+/oLwOGtgZ5G9LHxorh6QEKXzAfskU4h27FdN/oC6X0Si/Ichn AE1oMKAM9HE1qYBZ+tQsrnMJR7Dfq88= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 08/29] tools/xenlogd: add 9pfs walk request support Date: Wed, 1 Nov 2023 10:33:04 +0100 Message-Id: <20231101093325.30302-9-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the walk request of the 9pfs protocol. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenlogd/io.c | 138 ++++++++++++++++++++++++++++++++++++++++ tools/xenlogd/xenlogd.h | 1 + 2 files changed, 139 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index fa825c9f39..778e1dc2c9 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -27,9 +27,11 @@ #define P9_CMD_VERSION 100 #define P9_CMD_ATTACH 104 #define P9_CMD_ERROR 107 +#define P9_CMD_WALK 110 #define P9_MIN_MSIZE 2048 #define P9_VERSION "9P2000.u" +#define P9_WALK_MAXELEM 16 struct p9_qid { uint8_t type; @@ -523,6 +525,20 @@ static int fill_qid(const char *path, struct p9_qid *qid, struct stat *stbuf) return 0; } +static bool name_ok(const char *str) +{ + if ( !*str ) + return false; + + if ( strchr(str, '/' ) ) + return false; + + if ( !strcmp(str, "..") || !strcmp(str, ".") ) + return false; + + return true; +} + static void p9_error(device *device, uint16_t tag, uint32_t err) { unsigned int erroff; @@ -600,6 +616,124 @@ static void p9_attach(device *device, struct p9_header *hdr) fill_buffer(device, hdr->cmd + 1, hdr->tag, "Q", &qid); } +static void p9_walk(device *device, struct p9_header *hdr) +{ + uint32_t fid; + uint32_t newfid; + struct p9_fid *fidp; + struct p9_qid *qids = NULL; + unsigned int n_names = 0; + unsigned int *names = NULL; + unsigned int walked = 0; + unsigned int i; + char *path = NULL; + unsigned int path_len; + int ret; + + ret = fill_data(device, "UUaS", &fid, &newfid, &n_names, &names); + if ( n_names > P9_WALK_MAXELEM ) + { + p9_error(device, hdr->tag, EINVAL); + goto out; + } + if ( ret != 3 + n_names ) + { + p9_error(device, hdr->tag, errno); + goto out; + } + + fidp = find_fid(device, fid); + if ( !fidp ) + { + p9_error(device, hdr->tag, ENOENT); + goto out; + } + if ( fidp->opened ) + { + p9_error(device, hdr->tag, EINVAL); + goto out; + } + + path_len = strlen(fidp->path) + 1; + for ( i = 0; i < n_names; i++ ) + { + if ( !name_ok(device->str + names[i]) ) + { + p9_error(device, hdr->tag, ENOENT); + goto out; + } + path_len += strlen(device->str + names[i]) + 1; + } + path = calloc(path_len + 1, 1); + if ( !path ) + { + p9_error(device, hdr->tag, ENOMEM); + goto out; + } + strcpy(path, fidp->path); + + if ( n_names ) + { + qids = calloc(n_names, sizeof(*qids)); + if ( !qids ) + { + p9_error(device, hdr->tag, ENOMEM); + goto out; + } + for ( i = 0; i < n_names; i++ ) + { + strcat(path, "/"); + strcat(path, device->str + names[i]); + ret = fill_qid(path, qids + i, NULL); + if ( ret ) + { + if ( !walked ) + { + p9_error(device, hdr->tag, errno); + goto out; + } + break; + } + walked++; + } + } + + if ( walked == n_names ) + { + const char *rel_path = path + strlen(device->host_path); + bool ok = false; + + if ( fid == newfid ) + { + struct p9_fid *new_fidp; + + new_fidp = alloc_fid_mem(device, fid, rel_path); + if ( new_fidp ) + { + XEN_TAILQ_REMOVE(&device->fids, fidp, list); + XEN_TAILQ_INSERT_HEAD(&device->fids, new_fidp, list); + free(fidp); + ok = true; + } + } + else + ok = alloc_fid(device, newfid, rel_path); + + if ( !ok ) + { + p9_error(device, hdr->tag, errno); + goto out; + } + } + + fill_buffer(device, hdr->cmd + 1, hdr->tag, "aQ", &walked, qids); + + out: + free(qids); + free(path); + free(names); +} + void *io_thread(void *arg) { device *device = arg; @@ -663,6 +797,10 @@ void *io_thread(void *arg) p9_attach(device, &hdr); break; + case P9_CMD_WALK: + p9_walk(device, &hdr); + break; + default: syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", device->domid, device->devid, hdr.cmd); diff --git a/tools/xenlogd/xenlogd.h b/tools/xenlogd/xenlogd.h index bd2a283ccb..23f013af9e 100644 --- a/tools/xenlogd/xenlogd.h +++ b/tools/xenlogd/xenlogd.h @@ -22,6 +22,7 @@ struct p9_header { struct p9_fid { XEN_TAILQ_ENTRY(struct p9_fid) list; unsigned int fid; + bool opened; char path[]; }; From patchwork Wed Nov 1 09:33:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442698 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 84ADAC4332F for ; Wed, 1 Nov 2023 09:51:58 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626322.976499 (Exim 4.92) (envelope-from ) id 1qy7t3-00045T-7c; Wed, 01 Nov 2023 09:51:45 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626322.976499; Wed, 01 Nov 2023 09:51:45 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7t3-00045M-4o; Wed, 01 Nov 2023 09:51:45 +0000 Received: by outflank-mailman (input) for mailman id 626322; Wed, 01 Nov 2023 09:51:43 +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 1qy7cB-0005E0-On for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:19 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [2001:67c:2178:6::1c]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id d4d612ca-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:19 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id ECD8D21835; Wed, 1 Nov 2023 09:34:18 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id BC2C713460; Wed, 1 Nov 2023 09:34:18 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id bjaTLJobQmXzCAAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:18 +0000 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: d4d612ca-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831258; h=from:from:reply-to: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=+E0nJLTyclf5CJbKX/5YoRErJSYEG/DI6e1oQaOsog8=; b=AxiGrL9PBABzKDpoI3x/ry2nsJSvs/tZRvn9MxfY3oQ40chYOcrIm3bhEJTGiKeIW+PEO0 Y8KSjYxrKt/H32nVQHIKOWQp57xW1W1yKJFkiFot+zoWY6xNP2elypLxy9Qg9Dwo2gqeKj +3xYoPYT39SmKmqe7983V+pzydJhuPY= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 09/29] tools/xenlogd: add 9pfs open request support Date: Wed, 1 Nov 2023 10:33:05 +0100 Message-Id: <20231101093325.30302-10-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the open request of the 9pfs protocol. Signed-off-by: Juergen Gross --- tools/xenlogd/io.c | 130 ++++++++++++++++++++++++++++++++++++++++ tools/xenlogd/xenlogd.h | 4 ++ 2 files changed, 134 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 778e1dc2c9..c2b259f42e 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include /* For cpu barriers. */ #include @@ -28,6 +30,15 @@ #define P9_CMD_ATTACH 104 #define P9_CMD_ERROR 107 #define P9_CMD_WALK 110 +#define P9_CMD_OPEN 112 + +/* P9 protocol open flags. */ +#define P9_OREAD 0 /* read */ +#define P9_OWRITE 1 /* write */ +#define P9_ORDWR 2 /* read and write */ +#define P9_OMODEMASK 0x03 +#define P9_OTRUNC 0x10 /* or'ed in, truncate file first */ +#define P9_OREMOVE 0x40 /* or'ed in, remove file after clunk */ #define P9_MIN_MSIZE 2048 #define P9_VERSION "9P2000.u" @@ -734,6 +745,121 @@ static void p9_walk(device *device, struct p9_header *hdr) free(names); } +static int open_flags_from_mode(uint8_t mode) +{ + int flags; + + switch ( mode & P9_OMODEMASK ) + { + case P9_OREAD: + flags = O_RDONLY; + break; + + case P9_OWRITE: + flags = O_WRONLY; + break; + + case P9_ORDWR: + flags = O_RDWR; + break; + + default: + return -1; + } + + if ( mode & P9_OTRUNC ) + flags |= O_TRUNC; + + return flags; +} + +static unsigned int get_iounit(device *device, struct stat *st) +{ + return (device->max_size - st->st_blksize) & ~(st->st_blksize - 1); +} + +static void p9_open(device *device, struct p9_header *hdr) +{ + uint32_t fid; + uint8_t mode; + struct p9_fid *fidp; + struct stat st; + struct p9_qid qid; + uint32_t iounit; + int flags; + int ret; + + ret = fill_data(device, "Ub", &fid, &mode); + if ( ret != 2 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + if ( mode & ~(P9_OMODEMASK | P9_OTRUNC | P9_OREMOVE) ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp = find_fid(device, fid); + if ( !fidp ) + { + p9_error(device, hdr->tag, ENOENT); + return; + } + if ( fidp->opened ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + if ( stat(fidp->path, &st) < 0 ) + { + p9_error(device, hdr->tag, ENOENT); + return; + } + + fidp->isdir = S_ISDIR(st.st_mode); + fidp->mode = mode; + if ( fidp->isdir ) + { + if ( mode != P9_OREAD ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + fidp->data = opendir(fidp->path); + if ( !fidp->data ) + { + p9_error(device, hdr->tag, errno); + return; + } + fidp->fd = dirfd(fidp->data); + } + else + { + flags = open_flags_from_mode(mode); + if ( flags < 0 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp->fd = open(fidp->path, flags); + if ( fidp->fd < 0 ) + { + p9_error(device, hdr->tag, errno); + return; + } + } + + fill_qid(fidp->path, &qid, &st); + iounit = get_iounit(device, &st); + fidp->opened = true; + + fill_buffer(device, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit); +} + void *io_thread(void *arg) { device *device = arg; @@ -801,6 +927,10 @@ void *io_thread(void *arg) p9_walk(device, &hdr); break; + case P9_CMD_OPEN: + p9_open(device, &hdr); + break; + default: syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", device->domid, device->devid, hdr.cmd); diff --git a/tools/xenlogd/xenlogd.h b/tools/xenlogd/xenlogd.h index 23f013af9e..6b7b5e2b91 100644 --- a/tools/xenlogd/xenlogd.h +++ b/tools/xenlogd/xenlogd.h @@ -22,7 +22,11 @@ struct p9_header { struct p9_fid { XEN_TAILQ_ENTRY(struct p9_fid) list; unsigned int fid; + int fd; + uint8_t mode; bool opened; + bool isdir; + void *data; /* File type specific. */ char path[]; }; From patchwork Wed Nov 1 09:33:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442700 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 4B1C6C4167B for ; Wed, 1 Nov 2023 09:53:04 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626331.976529 (Exim 4.92) (envelope-from ) id 1qy7uC-0005u3-1n; Wed, 01 Nov 2023 09:52:56 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626331.976529; Wed, 01 Nov 2023 09:52:56 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7uB-0005tq-V8; Wed, 01 Nov 2023 09:52:55 +0000 Received: by outflank-mailman (input) for mailman id 626331; Wed, 01 Nov 2023 09:52:54 +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 1qy7cH-0005E0-8O for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:25 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id d824886c-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:24 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 807111F750; Wed, 1 Nov 2023 09:34:24 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4EADC13460; Wed, 1 Nov 2023 09:34:24 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id fJrgEaAbQmUACQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:24 +0000 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: d824886c-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831264; h=from:from:reply-to: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=e4bHBd5w4b6aQN5bSnfLHyQxglpMW3POgwkEjblrS94=; b=hJA/P0wkac8sPulY6IFoArEkSp4JUf+Jp8+95iSrMEE2CB7C5mH/IgWP5kHvVsIckCrvnR KbJLD/kgHa9VNtMQeRX6+mJglF8Rn2ZtFq3463+rmq5U2muuXv6LO1DT68iv3IyYCvnwk4 kIJUmvf+BzpvOF5ZX5YijN+KcGPU6dg= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 10/29] tools/xenlogd: add 9pfs clunk request support Date: Wed, 1 Nov 2023 10:33:06 +0100 Message-Id: <20231101093325.30302-11-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the clunk request of the 9pfs protocol. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenlogd/io.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index c2b259f42e..2607095e51 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -31,6 +31,7 @@ #define P9_CMD_ERROR 107 #define P9_CMD_WALK 110 #define P9_CMD_OPEN 112 +#define P9_CMD_CLUNK 120 /* P9 protocol open flags. */ #define P9_OREAD 0 /* read */ @@ -860,6 +861,38 @@ static void p9_open(device *device, struct p9_header *hdr) fill_buffer(device, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit); } +static void p9_clunk(device *device, struct p9_header *hdr) +{ + uint32_t fid; + struct p9_fid *fidp; + int ret; + + ret = fill_data(device, "U", &fid); + if ( ret != 1 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp = find_fid(device, fid); + if ( !fidp ) + { + p9_error(device, hdr->tag, ENOENT); + return; + } + + if ( fidp->opened ) + { + close(fidp->fd); + if ( fidp->mode & P9_OREMOVE ) + unlink(fidp->path); + } + + free_fid(device, fidp); + + fill_buffer(device, hdr->cmd + 1, hdr->tag, ""); +} + void *io_thread(void *arg) { device *device = arg; @@ -931,6 +964,10 @@ void *io_thread(void *arg) p9_open(device, &hdr); break; + case P9_CMD_CLUNK: + p9_clunk(device, &hdr); + break; + default: syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", device->domid, device->devid, hdr.cmd); From patchwork Wed Nov 1 09:33:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442673 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 0868AC4167D for ; Wed, 1 Nov 2023 09:34:48 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626250.976369 (Exim 4.92) (envelope-from ) id 1qy7cO-0000xP-Pm; Wed, 01 Nov 2023 09:34:32 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626250.976369; Wed, 01 Nov 2023 09:34:32 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7cO-0000xG-My; Wed, 01 Nov 2023 09:34:32 +0000 Received: by outflank-mailman (input) for mailman id 626250; Wed, 01 Nov 2023 09:34:31 +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 1qy7cN-0005sN-Sv for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:31 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id db63d30c-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:34:30 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 0C03B21846; Wed, 1 Nov 2023 09:34:30 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id D8D1613460; Wed, 1 Nov 2023 09:34:29 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id YJ+TM6UbQmULCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:29 +0000 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: db63d30c-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831270; h=from:from:reply-to: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=iYKu4ORgu+LVBDEqtNfJuA6R+ODvE4fC94p2On/5gV8=; b=QdG23Hcc2Eiqk0WPw8nPSZV4h+Od8vv1CJrrzNgSDcqrZu27pYMg4praAmBR5CAOHL3aMy snK4UiSHVujjexJ4lFacUXBXH81RU9Q4klX3q6yFFgfap5MeoT2Ag6mWRjuhH+x6J8Q9Xf EMN92RpaQI2b2/vlNTvqbpnAldKXCkI= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 11/29] tools/xenlogd: add 9pfs create request support Date: Wed, 1 Nov 2023 10:33:07 +0100 Message-Id: <20231101093325.30302-12-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the create request of the 9pfs protocol. Signed-off-by: Juergen Gross --- tools/xenlogd/io.c | 133 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 2607095e51..34f137be1b 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -31,6 +31,7 @@ #define P9_CMD_ERROR 107 #define P9_CMD_WALK 110 #define P9_CMD_OPEN 112 +#define P9_CMD_CREATE 114 #define P9_CMD_CLUNK 120 /* P9 protocol open flags. */ @@ -41,6 +42,12 @@ #define P9_OTRUNC 0x10 /* or'ed in, truncate file first */ #define P9_OREMOVE 0x40 /* or'ed in, remove file after clunk */ +/* P9 protocol create permission masks. */ +#define P9_CREATE_PERM_DIR 0x80000000 +#define P9_CREATE_PERM_NOTSUPP 0x03b00000 /* link, symlink, ... */ +#define P9_CREATE_PERM_DIR_MASK 0777 +#define P9_CREATE_PERM_FILE_MASK 0666 + #define P9_MIN_MSIZE 2048 #define P9_VERSION "9P2000.u" #define P9_WALK_MAXELEM 16 @@ -861,6 +868,128 @@ static void p9_open(device *device, struct p9_header *hdr) fill_buffer(device, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit); } +static void p9_create(device *device, struct p9_header *hdr) +{ + uint32_t fid; + unsigned int name_off; + uint32_t perm; + uint8_t mode; + unsigned int ext_off; + struct p9_fid *fidp; + struct p9_fid *new_fidp; + char *path; + struct stat st; + struct p9_qid qid; + uint32_t iounit; + int flags; + int ret; + + ret = fill_data(device, "USUbS", &fid, &name_off, &perm, &mode, &ext_off); + if ( ret != 5 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + if ( !name_ok(device->str + name_off) ) + { + p9_error(device, hdr->tag, ENOENT); + return; + } + + if ( perm & P9_CREATE_PERM_NOTSUPP ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp = find_fid(device, fid); + if ( !fidp || fidp->opened ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + path = malloc(strlen(fidp->path) + strlen(device->str + name_off) + 2 - + strlen(device->host_path)); + if ( !path ) + { + p9_error(device, hdr->tag, ENOMEM); + return; + } + sprintf(path, "%s/%s", fidp->path + strlen(device->host_path), + device->str + name_off); + new_fidp = alloc_fid_mem(device, fid, path); + free(path); + if ( !new_fidp ) + { + p9_error(device, hdr->tag, ENOMEM); + return; + } + + if ( perm & P9_CREATE_PERM_DIR ) + { + if ( mode != P9_OREAD ) + { + p9_error(device, hdr->tag, EINVAL); + free(new_fidp); + return; + } + if ( mkdir(new_fidp->path, perm & P9_CREATE_PERM_DIR_MASK) < 0 ) + { + p9_error(device, hdr->tag, errno); + free(new_fidp); + return; + } + + XEN_TAILQ_REMOVE(&device->fids, fidp, list); + XEN_TAILQ_INSERT_HEAD(&device->fids, new_fidp, list); + free(fidp); + fidp = new_fidp; + + fidp->data = opendir(fidp->path); + if ( !fidp->data ) + { + p9_error(device, hdr->tag, errno); + return; + } + fidp->fd = dirfd(fidp->data); + } + else + { + flags = open_flags_from_mode(mode); + if ( flags < 0 ) + { + p9_error(device, hdr->tag, EINVAL); + free(new_fidp); + return; + } + + XEN_TAILQ_REMOVE(&device->fids, fidp, list); + XEN_TAILQ_INSERT_HEAD(&device->fids, new_fidp, list); + free(fidp); + fidp = new_fidp; + + fidp->fd = creat(fidp->path, flags); + if ( fidp->fd < 0 ) + { + p9_error(device, hdr->tag, errno); + return; + } + } + + if ( stat(fidp->path, &st) < 0 ) + { + p9_error(device, hdr->tag, errno); + return; + } + fill_qid(fidp->path, &qid, &st); + iounit = get_iounit(device, &st); + fidp->opened = true; + + fill_buffer(device, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit); +} + static void p9_clunk(device *device, struct p9_header *hdr) { uint32_t fid; @@ -964,6 +1093,10 @@ void *io_thread(void *arg) p9_open(device, &hdr); break; + case P9_CMD_CREATE: + p9_create(device, &hdr); + break; + case P9_CMD_CLUNK: p9_clunk(device, &hdr); break; From patchwork Wed Nov 1 09:33:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442672 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 9FF49C4332F for ; Wed, 1 Nov 2023 09:34:47 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626252.976380 (Exim 4.92) (envelope-from ) id 1qy7cV-0001Ic-4i; Wed, 01 Nov 2023 09:34:39 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626252.976380; Wed, 01 Nov 2023 09:34:39 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7cV-0001IT-00; Wed, 01 Nov 2023 09:34:39 +0000 Received: by outflank-mailman (input) for mailman id 626252; Wed, 01 Nov 2023 09:34:37 +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 1qy7cT-0005sN-J8 for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:37 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id deb7cebc-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:34:35 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 9A3AE1F74D; Wed, 1 Nov 2023 09:34:35 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7555613460; Wed, 1 Nov 2023 09:34:35 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id oid6G6sbQmURCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:35 +0000 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: deb7cebc-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831275; h=from:from:reply-to: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=QJbdIr85qdX7H1mLMVKcVj+vNBSvf/s3S7aCwRXLZlQ=; b=FjGW66jTUk03x2O8LiH/g+o33zHciSnG4/T4VUzdZmrKM7aA0soKNvBrmSdn2by8i4U6rN iBf176Wiu1lrug9lUff6Qd18AcHNP1YU7HCIFmpAxCopK+AJZUi85e1ZCcRjBJgEt9VGhC QxR3G6DkI9FzhVDximIimoZlhQL/Wgg= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 12/29] tools/xenlogd: add 9pfs stat request support Date: Wed, 1 Nov 2023 10:33:08 +0100 Message-Id: <20231101093325.30302-13-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the stat request of the 9pfs protocol. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenlogd/io.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 34f137be1b..6e92667fab 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -33,6 +33,7 @@ #define P9_CMD_OPEN 112 #define P9_CMD_CREATE 114 #define P9_CMD_CLUNK 120 +#define P9_CMD_STAT 124 /* P9 protocol open flags. */ #define P9_OREAD 0 /* read */ @@ -59,6 +60,25 @@ struct p9_qid { uint64_t path; }; +struct p9_stat { + uint16_t size; + uint16_t type; + uint32_t dev; + struct p9_qid qid; + uint32_t mode; + uint32_t atime; + uint32_t mtime; + uint64_t length; + const char *name; + const char *uid; + const char *gid; + const char *muid; + const char *extension; + uint32_t n_uid; + uint32_t n_gid; + uint32_t n_muid; +}; + /* * Note that the ring names "in" and "out" are from the frontend's * perspective, so the "in" ring will be used for responses to the frontend, @@ -1022,6 +1042,71 @@ static void p9_clunk(device *device, struct p9_header *hdr) fill_buffer(device, hdr->cmd + 1, hdr->tag, ""); } +static void fill_p9_stat(struct p9_stat *p9s, struct stat *st, const char *name) +{ + memset(p9s, 0, sizeof(*p9s)); + fill_qid(NULL, &p9s->qid, st); + p9s->mode = st->st_mode & 0777; + if ( S_ISDIR(st->st_mode) ) + p9s->mode |= P9_CREATE_PERM_DIR; + p9s->atime = st->st_atime; + p9s->mtime = st->st_mtime; + p9s->length = st->st_size; + p9s->name = name; + p9s->uid = ""; + p9s->gid = ""; + p9s->muid = ""; + p9s->extension = ""; + p9s->n_uid = 0; + p9s->n_gid = 0; + p9s->n_muid = 0; + + /* + * Size of individual fields without the size field, including 5 2-byte + * string length fields. + */ + p9s->size = 71 + strlen(p9s->name); +} + +static void p9_stat(device *device, struct p9_header *hdr) +{ + uint32_t fid; + struct p9_fid *fidp; + struct p9_stat p9s; + struct stat st; + uint16_t total_length; + int ret; + + ret = fill_data(device, "U", &fid); + if ( ret != 1 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp = find_fid(device, fid); + if ( !fidp ) + { + p9_error(device, hdr->tag, ENOENT); + return; + } + + if ( stat(fidp->path, &st) < 0 ) + { + p9_error(device, hdr->tag, errno); + return; + } + fill_p9_stat(&p9s, &st, strrchr(fidp->path, '/') + 1); + + total_length = p9s.size + sizeof(p9s.size); + fill_buffer(device, hdr->cmd + 1, hdr->tag, "uuuUQUUULSSSSSUUU", + &total_length, &p9s.size, &p9s.type, &p9s.dev, &p9s.qid, + &p9s.mode, &p9s.atime, &p9s.mtime, &p9s.length, p9s.name, + p9s.uid, p9s.gid, p9s.muid, p9s.extension, &p9s.n_uid, + &p9s.n_gid, &p9s.n_muid); + +} + void *io_thread(void *arg) { device *device = arg; @@ -1101,6 +1186,10 @@ void *io_thread(void *arg) p9_clunk(device, &hdr); break; + case P9_CMD_STAT: + p9_stat(device, &hdr); + break; + default: syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n", device->domid, device->devid, hdr.cmd); From patchwork Wed Nov 1 09:33:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442705 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 87CFFC4332F for ; Wed, 1 Nov 2023 09:54:30 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626349.976569 (Exim 4.92) (envelope-from ) id 1qy7vZ-0000SR-8L; Wed, 01 Nov 2023 09:54:21 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626349.976569; Wed, 01 Nov 2023 09:54:21 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7vZ-0000SK-5A; Wed, 01 Nov 2023 09:54:21 +0000 Received: by outflank-mailman (input) for mailman id 626349; Wed, 01 Nov 2023 09:54:19 +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 1qy7cX-0005E0-RO for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:41 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id e20f467e-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:41 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 287401F74D; Wed, 1 Nov 2023 09:34:41 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 02A2913460; Wed, 1 Nov 2023 09:34:40 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id DAT3OrAbQmUZCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:40 +0000 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: e20f467e-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831281; h=from:from:reply-to: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=3GExNKp/yhu+n6P2BIY5jfXZkhxU99CKU37BbtunsSk=; b=MppCvh+L8QO/WnZb70zdnCMROQq+m03SnlwSi2B8zsq7VvpsfxRwRzoa00hFBPd64pUJ6A FZGNhOZjZp9r9/AORC30jIYPaq+MBY4VA83H/ETdfTaIRn/ofphTyrrAi36CYy9/WMuu5m T3p1LWPe58VjNh+En1lplnIM7bpF/D8= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 13/29] tools/xenlogd: add 9pfs write request support Date: Wed, 1 Nov 2023 10:33:09 +0100 Message-Id: <20231101093325.30302-14-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the write request of the 9pfs protocol. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenlogd/io.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 6e92667fab..6b4692ca67 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -32,6 +32,7 @@ #define P9_CMD_WALK 110 #define P9_CMD_OPEN 112 #define P9_CMD_CREATE 114 +#define P9_CMD_WRITE 118 #define P9_CMD_CLUNK 120 #define P9_CMD_STAT 124 @@ -1010,6 +1011,51 @@ static void p9_create(device *device, struct p9_header *hdr) fill_buffer(device, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit); } +static void p9_write(device *device, struct p9_header *hdr) +{ + uint32_t fid; + uint64_t off; + unsigned int len; + uint32_t written; + void *buf; + struct p9_fid *fidp; + int ret; + + ret = fill_data(device, "ULD", &fid, &off, &len, device->buffer); + if ( ret != 3 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp = find_fid(device, fid); + if ( !fidp || !fidp->opened || fidp->isdir ) + { + p9_error(device, hdr->tag, EBADF); + return; + } + + buf = device->buffer; + + while ( len != 0 ) + { + ret = pwrite(fidp->fd, buf, len, off); + if ( ret < 0 ) + break; + len -= ret; + buf += ret; + off += ret; + } + + written = buf - device->buffer; + if ( written == 0 ) + { + p9_error(device, hdr->tag, errno); + return; + } + fill_buffer(device, hdr->cmd + 1, hdr->tag, "U", &written); +} + static void p9_clunk(device *device, struct p9_header *hdr) { uint32_t fid; @@ -1182,6 +1228,10 @@ void *io_thread(void *arg) p9_create(device, &hdr); break; + case P9_CMD_WRITE: + p9_write(device, &hdr); + break; + case P9_CMD_CLUNK: p9_clunk(device, &hdr); break; From patchwork Wed Nov 1 09:33:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442674 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 BB941C4332F for ; Wed, 1 Nov 2023 09:35:03 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626255.976389 (Exim 4.92) (envelope-from ) id 1qy7cg-0001pc-Ei; Wed, 01 Nov 2023 09:34:50 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626255.976389; Wed, 01 Nov 2023 09:34:50 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7cg-0001pV-Bu; Wed, 01 Nov 2023 09:34:50 +0000 Received: by outflank-mailman (input) for mailman id 626255; Wed, 01 Nov 2023 09:34:48 +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 1qy7ce-0005sN-Fs for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:48 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id e55372ef-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:34:46 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id AFD661F74D; Wed, 1 Nov 2023 09:34:46 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 8924813460; Wed, 1 Nov 2023 09:34:46 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id q2IdILYbQmUlCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:46 +0000 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: e55372ef-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831286; h=from:from:reply-to: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=lD7OYj5Yt2uwwISmgGvZUOhfU+UjKp9N5PIhwoDUvt4=; b=FAhpGBUB5tJOWxQcnddOSvFXFux2A4K8QwWGeXi9JX/xoj7O8uG1mDdhzne8LutEltj/w5 fmXA7Sl3eH9aZ0KevqobefRCbVtgSQPLFID+eV8oRHVZEOtkxzOtucM+dWFjtkjiCJv5Kd Nxglq6waIkTZgCK8xwphW4TcVKWRn1w= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 14/29] tools/xenlogd: add 9pfs read request support Date: Wed, 1 Nov 2023 10:33:10 +0100 Message-Id: <20231101093325.30302-15-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add the read request of the 9pfs protocol. For now support only reading plain files (no directories). Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenlogd/io.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tools/xenlogd/io.c b/tools/xenlogd/io.c index 6b4692ca67..b3f9f96bcc 100644 --- a/tools/xenlogd/io.c +++ b/tools/xenlogd/io.c @@ -32,6 +32,7 @@ #define P9_CMD_WALK 110 #define P9_CMD_OPEN 112 #define P9_CMD_CREATE 114 +#define P9_CMD_READ 116 #define P9_CMD_WRITE 118 #define P9_CMD_CLUNK 120 #define P9_CMD_STAT 124 @@ -1011,6 +1012,61 @@ static void p9_create(device *device, struct p9_header *hdr) fill_buffer(device, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit); } +static void p9_read(device *device, struct p9_header *hdr) +{ + uint32_t fid; + uint64_t off; + unsigned int len; + uint32_t count; + void *buf; + struct p9_fid *fidp; + int ret; + + ret = fill_data(device, "ULU", &fid, &off, &count); + if ( ret != 3 ) + { + p9_error(device, hdr->tag, EINVAL); + return; + } + + fidp = find_fid(device, fid); + if ( !fidp || !fidp->opened ) + { + p9_error(device, hdr->tag, EBADF); + return; + } + + if ( fidp->isdir ) + { + p9_error(device, hdr->tag, EOPNOTSUPP); + return; + } + else + { + len = count; + buf = device->buffer + sizeof(*hdr) + sizeof(uint32_t); + + while ( len != 0 ) + { + ret = pread(fidp->fd, buf, len, off); + if ( ret <= 0 ) + break; + len -= ret; + buf += ret; + off += ret; + } + if ( ret && len == count ) + { + p9_error(device, hdr->tag, errno); + return; + } + + buf = device->buffer + sizeof(*hdr) + sizeof(uint32_t); + len = count - len; + fill_buffer(device, hdr->cmd + 1, hdr->tag, "D", &len, buf); + } +} + static void p9_write(device *device, struct p9_header *hdr) { uint32_t fid; @@ -1228,6 +1284,10 @@ void *io_thread(void *arg) p9_create(device, &hdr); break; + case P9_CMD_READ: + p9_read(device, &hdr); + break; + case P9_CMD_WRITE: p9_write(device, &hdr); break; From patchwork Wed Nov 1 09:33:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442697 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 C37ADC4332F for ; Wed, 1 Nov 2023 09:51:37 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626318.976488 (Exim 4.92) (envelope-from ) id 1qy7sl-0003dg-Sd; Wed, 01 Nov 2023 09:51:27 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626318.976488; Wed, 01 Nov 2023 09:51:27 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7sl-0003dZ-Px; Wed, 01 Nov 2023 09:51:27 +0000 Received: by outflank-mailman (input) for mailman id 626318; Wed, 01 Nov 2023 09:51:26 +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 1qy7cj-0005E0-4t for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:53 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [2001:67c:2178:6::1c]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id e8b1f2cb-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:52 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 4815E21A34; Wed, 1 Nov 2023 09:34:52 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 224B113460; Wed, 1 Nov 2023 09:34:52 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id gzoMB7wbQmUuCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:52 +0000 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: e8b1f2cb-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831292; h=from:from:reply-to: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=w3PBNBB3kJ9bivxGczmEg6Y0kCgbJHQRQkdhIETfwqU=; b=Cna131tUSW3IdHlOx4FSuIUfpI+8J3oyqRhdPU4V/Fgfz9pxj4/+HDyNKawmLm7vg8oYQM xvK5gz7tGU3qsfMEf+9pUVcnY5AUzfFBGS+q+EEXK0wlHeboAGoTGiFlR2JrLFPgVBobMw owbCLPaZU2xc7wmJKchG7lrQ+PcA5qA= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 15/29] tools/libs/light: add backend type for 9pfs PV devices Date: Wed, 1 Nov 2023 10:33:11 +0100 Message-Id: <20231101093325.30302-16-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Make the backend type of 9pfs PV devices configurable. The default is "qemu" with the related Xenstore backend-side directory being "9pfs". Add another type "xenlogd" with the related Xenstore backend-side directory "xen_9pfs". As additional security features it is possible to specify: - "max-space" for limiting the maximum space consumed on the filesystem in MBs - "max-files" for limiting the maximum number of files in the filesystem - "max-open-files" for limiting the maximum number of concurrent open files For convenience "auto-delete" is available to let the backend delete the oldest file of the guest in case otherwise "max-space" or "max-files" would be violated. The xenlogd daemon will be started by libxenlight automatically when the first "xen_9pfs" device is being created. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/libs/light/libxl_9pfs.c | 143 +++++++++++++++++++++- tools/libs/light/libxl_create.c | 4 +- tools/libs/light/libxl_dm.c | 2 +- tools/libs/light/libxl_types.idl | 11 ++ tools/libs/light/libxl_types_internal.idl | 1 + 5 files changed, 154 insertions(+), 7 deletions(-) diff --git a/tools/libs/light/libxl_9pfs.c b/tools/libs/light/libxl_9pfs.c index 5ab0d3aa21..0b9d84dce9 100644 --- a/tools/libs/light/libxl_9pfs.c +++ b/tools/libs/light/libxl_9pfs.c @@ -33,20 +33,157 @@ static int libxl__set_xenstore_p9(libxl__gc *gc, uint32_t domid, flexarray_append_pair(front, "tag", p9->tag); + if (p9->type == LIBXL_P9_TYPE_XENLOGD) { + flexarray_append_pair(back, "max-space", + GCSPRINTF("%u", p9->max_space)); + flexarray_append_pair(back, "max-files", + GCSPRINTF("%u", p9->max_files)); + flexarray_append_pair(back, "max-open-files", + GCSPRINTF("%u", p9->max_open_files)); + flexarray_append_pair(back, "auto-delete", + p9->auto_delete ? "1" : "0"); + } + + return 0; +} + +static int libxl__device_from_p9(libxl__gc *gc, uint32_t domid, + libxl_device_p9 *type, libxl__device *device) +{ + device->backend_devid = type->devid; + device->backend_domid = type->backend_domid; + device->backend_kind = type->type == LIBXL_P9_TYPE_QEMU + ? LIBXL__DEVICE_KIND_9PFS + : LIBXL__DEVICE_KIND_XEN_9PFS; + device->devid = type->devid; + device->domid = domid; + device->kind = LIBXL__DEVICE_KIND_9PFS; + return 0; } -#define libxl__add_p9s NULL +static int libxl_device_p9_dm_needed(void *e, unsigned domid) +{ + libxl_device_p9 *elem = e; + + return elem->type == LIBXL_P9_TYPE_QEMU && elem->backend_domid == domid; +} + +typedef struct libxl__aop9_state libxl__aop9_state; + +struct libxl__aop9_state { + libxl__spawn_state spawn; + libxl__ao_device *aodev; + libxl_device_p9 *p9; + uint32_t domid; + void (*callback)(libxl__egc *, libxl__aop9_state *, int); +}; + +static void xenlogd_spawn_outcome(libxl__egc *egc, libxl__aop9_state *aop9, + int rc) +{ + aop9->aodev->rc = rc; + if (rc) + aop9->aodev->callback(egc, aop9->aodev); + else + libxl__device_add_async(egc, aop9->domid, &libxl__p9_devtype, + aop9->p9, aop9->aodev); +} + +static void xenlogd_confirm(libxl__egc *egc, libxl__spawn_state *spawn, + const char *xsdata) +{ + STATE_AO_GC(spawn->ao); + + if (!xsdata) + return; + + if (strcmp(xsdata, "running")) + return; + + libxl__spawn_initiate_detach(gc, spawn); +} + +static void xenlogd_failed(libxl__egc *egc, libxl__spawn_state *spawn, int rc) +{ + libxl__aop9_state *aop9 = CONTAINER_OF(spawn, *aop9, spawn); + + xenlogd_spawn_outcome(egc, aop9, rc); +} + +static void xenlogd_detached(libxl__egc *egc, libxl__spawn_state *spawn) +{ + libxl__aop9_state *aop9 = CONTAINER_OF(spawn, *aop9, spawn); + + xenlogd_spawn_outcome(egc, aop9, 0); +} + +static int xenlogd_spawn(libxl__egc *egc, uint32_t domid, libxl_device_p9 *p9, + libxl__ao_device *aodev) +{ + STATE_AO_GC(aodev->ao); + struct libxl__aop9_state *aop9; + int rc; + char *args[] = { "xenlogd", NULL }; + + if (p9->type != LIBXL_P9_TYPE_XENLOGD || + libxl__xs_read(gc, XBT_NULL, "/tool/xenlog/state")) + return 0; + + GCNEW(aop9); + aop9->aodev = aodev; + aop9->p9 = p9; + aop9->domid = domid; + aop9->callback = xenlogd_spawn_outcome; + + aop9->spawn.ao = aodev->ao; + aop9->spawn.what = "xenlog daemon"; + aop9->spawn.xspath = "/tool/xenlog/state"; + aop9->spawn.timeout_ms = LIBXL_DEVICE_MODEL_START_TIMEOUT * 1000; + aop9->spawn.pidpath = "/tool/xenlog/pid"; + aop9->spawn.midproc_cb = libxl__spawn_record_pid; + aop9->spawn.confirm_cb = xenlogd_confirm; + aop9->spawn.failure_cb = xenlogd_failed; + aop9->spawn.detached_cb = xenlogd_detached; + rc = libxl__spawn_spawn(egc, &aop9->spawn); + if (rc < 0) + return rc; + if (!rc) { + setsid(); + libxl__exec(gc, -1, -1, -1, LIBEXEC_BIN "/xenlogd", args, NULL); + } + + return 1; +} + +static void libxl__device_p9_add(libxl__egc *egc, uint32_t domid, + libxl_device_p9 *p9, + libxl__ao_device *aodev) +{ + int rc; + + rc = xenlogd_spawn(egc, domid, p9, aodev); + if (rc == 1) + return; + + if (rc == 0) + libxl__device_add_async(egc, domid, &libxl__p9_devtype, p9, aodev); + + aodev->rc = rc; + if (rc) + aodev->callback(egc, aodev); +} + #define libxl_device_p9_list NULL #define libxl_device_p9_compare NULL static LIBXL_DEFINE_UPDATE_DEVID(p9) -static LIBXL_DEFINE_DEVICE_FROM_TYPE(p9) +static LIBXL_DEFINE_DEVICES_ADD(p9) LIBXL_DEFINE_DEVICE_REMOVE(p9) DEFINE_DEVICE_TYPE_STRUCT(p9, 9PFS, p9s, - .skip_attach = 1, .set_xenstore_config = (device_set_xenstore_config_fn_t) libxl__set_xenstore_p9, + .dm_needed = libxl_device_p9_dm_needed, ); diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c index ce1d431103..b19e9379b6 100644 --- a/tools/libs/light/libxl_create.c +++ b/tools/libs/light/libxl_create.c @@ -1760,9 +1760,6 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev, libxl__device_console_dispose(&console); } - for (i = 0; i < d_config->num_p9s; i++) - libxl__device_add(gc, domid, &libxl__p9_devtype, &d_config->p9s[i]); - for (i = 0; i < d_config->num_pvcallsifs; i++) libxl__device_add(gc, domid, &libxl__pvcallsif_devtype, &d_config->pvcallsifs[i]); @@ -1899,6 +1896,7 @@ const libxl__device_type *device_type_tbl[] = { &libxl__vdispl_devtype, &libxl__vsnd_devtype, &libxl__virtio_devtype, + &libxl__p9_devtype, NULL }; diff --git a/tools/libs/light/libxl_dm.c b/tools/libs/light/libxl_dm.c index 14b593110f..2aaaeb5aa7 100644 --- a/tools/libs/light/libxl_dm.c +++ b/tools/libs/light/libxl_dm.c @@ -3761,7 +3761,7 @@ int libxl__need_xenpv_qemu(libxl__gc *gc, libxl_domain_config *d_config) goto out; } - if (d_config->num_vfbs > 0 || d_config->num_p9s > 0) { + if (d_config->num_vfbs > 0) { ret = 1; goto out; } diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl index 7d8bd5d216..e910bf1621 100644 --- a/tools/libs/light/libxl_types.idl +++ b/tools/libs/light/libxl_types.idl @@ -150,6 +150,12 @@ libxl_nic_type = Enumeration("nic_type", [ (2, "VIF"), ]) +libxl_p9_type = Enumeration("p9_type", [ + (0, "unknown"), + (1, "qemu"), + (2, "xenlogd"), + ]) + libxl_action_on_shutdown = Enumeration("action_on_shutdown", [ (1, "DESTROY"), @@ -942,6 +948,11 @@ libxl_device_p9 = Struct("device_p9", [ ("path", string), ("security_model", string), ("devid", libxl_devid), + ("type", libxl_p9_type), + ("max_space", integer), + ("max_files", integer), + ("max_open_files", integer), + ("auto_delete", bool), ]) libxl_device_pvcallsif = Struct("device_pvcallsif", [ diff --git a/tools/libs/light/libxl_types_internal.idl b/tools/libs/light/libxl_types_internal.idl index e24288f1a5..39da71cef5 100644 --- a/tools/libs/light/libxl_types_internal.idl +++ b/tools/libs/light/libxl_types_internal.idl @@ -34,6 +34,7 @@ libxl__device_kind = Enumeration("device_kind", [ (16, "VINPUT"), (17, "VIRTIO_DISK"), (18, "VIRTIO"), + (19, "XEN_9PFS"), ]) libxl__console_backend = Enumeration("console_backend", [ From patchwork Wed Nov 1 09:33:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442701 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 E801FC4332F for ; Wed, 1 Nov 2023 09:53:03 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626330.976518 (Exim 4.92) (envelope-from ) id 1qy7u3-0005aF-PW; Wed, 01 Nov 2023 09:52:47 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626330.976518; Wed, 01 Nov 2023 09:52:47 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7u3-0005a8-My; Wed, 01 Nov 2023 09:52:47 +0000 Received: by outflank-mailman (input) for mailman id 626330; Wed, 01 Nov 2023 09:52:46 +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 1qy7co-0005E0-LG for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:34:58 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [2001:67c:2178:6::1c]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id ec07ff52-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:34:58 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id D8F5021A34; Wed, 1 Nov 2023 09:34:57 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id B192B13460; Wed, 1 Nov 2023 09:34:57 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id S5b8KcEbQmU0CQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:34:57 +0000 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: ec07ff52-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831297; h=from:from:reply-to: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=l2duKyjEiM300bkMtOBaVkepRhfhz+lqeaPmjMIQyAk=; b=CMcpfSq9Qi/4smsf1UC6cVAn+tV5ljvH7fyTC67ZhKQCQTC9wpzXTjf/Pe7pfhXq2yiSp7 n9prsPomAQYEPQ2n8xZJDBiDMLSVy5Xnw3jRdyR+oEL/+Cqqk6/VuMQtBcxhpWLdszo5Gj jkFUj+OuyLb+HrDJNwEYtYM2qfTswZw= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD Subject: [PATCH 16/29] tools/xl: support new 9pfs backend xenlogd Date: Wed, 1 Nov 2023 10:33:12 +0100 Message-Id: <20231101093325.30302-17-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add support for the new 9pfs backend "xenlogd". For this backend type the tag defaults to "Xen" and the host side path to "/var/log/xen/guests/". Signed-off-by: Juergen Gross --- docs/man/xl.cfg.5.pod.in | 36 ++++++++++++++++++++++++++++++++++-- tools/xl/xl_parse.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in index 2e234b450e..be82d35eed 100644 --- a/docs/man/xl.cfg.5.pod.in +++ b/docs/man/xl.cfg.5.pod.in @@ -772,10 +772,16 @@ settings, from the following list: =over 4 +=item B + +The backendtype for the PV device. Supported values are B and B. +The default is B. + =item B 9pfs tag to identify the filesystem share. The tag is needed on the -guest side to mount it. +guest side to mount it. For the backendtype of B the tag defaults to +"Xen". =item B @@ -785,12 +791,38 @@ squash or remap). =item B -Filesystem path on the backend to export. +Filesystem path on the backend to export. For the backendtype of B +the path defaults to "@XEN_LOG_DIR@/guests/". =item B Specify the backend domain name or id, defaults to dom0. +=item B + +Specify the maximum number of files below B. A value of 0 (which +is the default) doesn't limit the number of files. Only valid for +B. + +=item B + +Specify the maximum number of concurrently opened files below B. +Multiple opens of the same file are counted individually. Only valid for +B, which has a default of B. + +=item B + +Specify the maximum used disk space in MiB below B. A value of 0 (which +is the default) doesn't limit the usable disk space. Only valid for +B. + +=item B + +When set the backend will delete the oldest file which is currently not +opened by the guest in case the disk space limit set via B or the +file limit set via B is being reached. Only valid for +B. + =back =item B diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index ed983200c3..346532e117 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -2232,6 +2232,20 @@ void parse_config_data(const char *config_source, replace_string(&p9->tag, value); } else if (!strcmp(key, "backend")) { replace_string(&p9->backend_domname, value); + } else if (!strcmp(key, "type")) { + if (libxl_p9_type_from_string(value, &p9->type)) { + fprintf(stderr, "failed to parse 9pfs type: %s\n", + value); + exit(1); + } + } else if (!strcmp(key, "max-files")) { + p9->max_files = parse_ulong(value); + } else if (!strcmp(key, "max-open-files")) { + p9->max_open_files = parse_ulong(value); + } else if (!strcmp(key, "max-space")) { + p9->max_space = parse_ulong(value); + } else if (!strcmp(key, "auto-delete")) { + p9->auto_delete = strtoul(value, NULL, 0); } else { fprintf(stderr, "Unknown 9pfs parameter '%s'\n", key); exit(1); @@ -2242,6 +2256,27 @@ void parse_config_data(const char *config_source, libxl_string_list_dispose(&pairs); + if (p9->type == LIBXL_P9_TYPE_UNKNOWN) { + p9->type = LIBXL_P9_TYPE_QEMU; + } + if (p9->type == LIBXL_P9_TYPE_QEMU && + (p9->max_space || p9->auto_delete)) { + fprintf(stderr, "Illegal 9pfs parameter combination\n"); + exit(1); + } + if (p9->type == LIBXL_P9_TYPE_XENLOGD) { + if (!p9->tag) { + replace_string(&p9->tag, "Xen"); + } + if (!p9->path) { + char *path; + + xasprintf(&path, XEN_LOG_DIR "/guests/%s", c_info->name); + replace_string(&p9->path, path); + free(path); + } + } + if (!p9->path || !p9->security_model || !p9->tag) { fprintf(stderr, "9pfs spec missing required field!\n"); exit(1); From patchwork Wed Nov 1 09:33:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442702 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 56CBFC4332F for ; Wed, 1 Nov 2023 09:53:24 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626333.976539 (Exim 4.92) (envelope-from ) id 1qy7uR-0006Ug-As; Wed, 01 Nov 2023 09:53:11 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626333.976539; Wed, 01 Nov 2023 09:53:11 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7uR-0006UY-5d; Wed, 01 Nov 2023 09:53:11 +0000 Received: by outflank-mailman (input) for mailman id 626333; Wed, 01 Nov 2023 09:53:09 +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 1qy7cv-0005sN-79 for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:05 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id ef4ffffe-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:35:03 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 723EF1F74A; Wed, 1 Nov 2023 09:35:03 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 46EC513460; Wed, 1 Nov 2023 09:35:03 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id X4TnD8cbQmVACQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:03 +0000 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: ef4ffffe-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831303; h=from:from:reply-to: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=27vJ80eI9t0Dmh4t3Smn4CXNhdUOQ+kVQRJUrk4nmkU=; b=PRegSZq/D2YS2jcVY5VwV2nLmFeWrzfWv3s0ckAcO9GitxC6bbU6jRzOKuC3yyEsMaeopF I9hBWyqW1SSGwpToPCdPOYQhd9htCExSCA2oqoG6MdfqhFKoS0GisSqQ4lyX8hnD0qg428 KfIz0VBjdEYINVgfGt+RE5d5QlxcnrA= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 17/29] tools/helpers: allocate xenstore event channel for xenstore stubdom Date: Wed, 1 Nov 2023 10:33:13 +0100 Message-Id: <20231101093325.30302-18-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 In order to prepare support of PV frontends in xenstore-stubdom, add allocation of a Xenstore event channel to init-xenstore-domain.c. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/helpers/init-xenstore-domain.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c index b2d5df8ba5..140ed610ae 100644 --- a/tools/helpers/init-xenstore-domain.c +++ b/tools/helpers/init-xenstore-domain.c @@ -248,6 +248,13 @@ static int build(xc_interface *xch) dom->cmdline = xc_dom_strdup(dom, cmdline); dom->xenstore_domid = domid; dom->console_evtchn = console_evtchn; + rv = xc_evtchn_alloc_unbound(xch, domid, domid); + if ( rv < 0 ) + { + fprintf(stderr, "xc_evtchn_alloc_unbound failed\n"); + goto err; + } + dom->xenstore_evtchn = rv; rv = xc_dom_mem_init(dom, memory); if ( rv ) From patchwork Wed Nov 1 09:33:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442694 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 4017AC4167B for ; Wed, 1 Nov 2023 09:48:17 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626301.976459 (Exim 4.92) (envelope-from ) id 1qy7pS-0000Bg-1n; Wed, 01 Nov 2023 09:48:02 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626301.976459; Wed, 01 Nov 2023 09:48: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 1qy7pR-0000BZ-UO; Wed, 01 Nov 2023 09:48:01 +0000 Received: by outflank-mailman (input) for mailman id 626301; Wed, 01 Nov 2023 09:48: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 1qy7cz-0005E0-Rx for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:09 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id f2b8dac9-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:35:09 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 1BEF41F74A; Wed, 1 Nov 2023 09:35:09 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id E6B9F13460; Wed, 1 Nov 2023 09:35:08 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 2gIaN8wbQmVWCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:08 +0000 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: f2b8dac9-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831309; h=from:from:reply-to: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=o4iqEXJmoZDlxNSf/ct8F3oPFJck5Vf1mV174DKFLFU=; b=JaUKC/pD88b+g7Gk2mtt3578hhevWGZfzX6lK5PKnGXKiMDCkBBilbdONSiYaiIO+5usvx mDm9HmwQZT4nqefgY+Uf2HImlIzzF1jNNWS61voEn1uEUHy4oPsWDtQi7uRGkJkqeSDTPo SvCWT0/421lnsVsxbbQSEJofdRm4PYs= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 18/29] tools/xenstored: rename xenbus_evtchn() Date: Wed, 1 Nov 2023 10:33:14 +0100 Message-Id: <20231101093325.30302-19-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Rename the xenbus_evtchn() function to get_xenbus_evtchn() in order to avoid two externally visible symbols with the same name when Xenstore- stubdom is being built with a Mini-OS with CONFIG_XENBUS set. Signed-off-by: Juergen Gross Reviewed-by: Julien Grall --- tools/xenstored/core.h | 2 +- tools/xenstored/domain.c | 2 +- tools/xenstored/minios.c | 2 +- tools/xenstored/posix.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h index ad87199042..480b0f5f7b 100644 --- a/tools/xenstored/core.h +++ b/tools/xenstored/core.h @@ -383,7 +383,7 @@ static inline bool domain_is_unprivileged(const struct connection *conn) } /* Return the event channel used by xenbus. */ -evtchn_port_t xenbus_evtchn(void); +evtchn_port_t get_xenbus_evtchn(void); /* Write out the pidfile */ void write_pidfile(const char *pidfile); diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c index 409b53acf9..6ef136e01f 100644 --- a/tools/xenstored/domain.c +++ b/tools/xenstored/domain.c @@ -1208,7 +1208,7 @@ void dom0_init(void) evtchn_port_t port; struct domain *dom0; - port = xenbus_evtchn(); + port = get_xenbus_evtchn(); if (port == -1) barf_perror("Failed to initialize dom0 port"); diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c index b5c3a205e6..0779efbf91 100644 --- a/tools/xenstored/minios.c +++ b/tools/xenstored/minios.c @@ -38,7 +38,7 @@ void init_pipe(int reopen_log_pipe[2]) reopen_log_pipe[1] = -1; } -evtchn_port_t xenbus_evtchn(void) +evtchn_port_t get_xenbus_evtchn(void) { return dom0_event; } diff --git a/tools/xenstored/posix.c b/tools/xenstored/posix.c index 6ac45fdb45..7e03dd982d 100644 --- a/tools/xenstored/posix.c +++ b/tools/xenstored/posix.c @@ -111,7 +111,7 @@ void unmap_xenbus(void *interface) munmap(interface, getpagesize()); } -evtchn_port_t xenbus_evtchn(void) +evtchn_port_t get_xenbus_evtchn(void) { int fd; int rc; From patchwork Wed Nov 1 09:33:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442693 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 6034BC4332F for ; Wed, 1 Nov 2023 09:48:04 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626299.976448 (Exim 4.92) (envelope-from ) id 1qy7pK-0008JA-OQ; Wed, 01 Nov 2023 09:47:54 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626299.976448; Wed, 01 Nov 2023 09:47:54 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7pK-0008J3-Lv; Wed, 01 Nov 2023 09:47:54 +0000 Received: by outflank-mailman (input) for mailman id 626299; Wed, 01 Nov 2023 09:47:53 +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 1qy7d5-0005E0-BR for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:15 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [2001:67c:2178:6::1d]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id f60426cb-7899-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:35:14 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 9D2471F74A; Wed, 1 Nov 2023 09:35:14 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7BDAC13460; Wed, 1 Nov 2023 09:35:14 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 07v7HNIbQmVdCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:14 +0000 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: f60426cb-7899-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831314; h=from:from:reply-to: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=0BCvqkeF/p7gtxHE7eM8MzybUWLvedVAfVRJo1N4ieE=; b=skswm6PqpH/X2ANmAYar1eIoRvBMUhIG1XfSQEW+md0ZUYtotEDcA4gcnnME3l3USe1swB Nd23c2PAGnik/Vf+9S5EeXS1Q/u725p/Hqgv8BzVTo+oIM+7OQuTESsrvOStDmovD5w4q8 sJCPQyBlvA2w6mYehUJWT8dNj8NUYRE= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Samuel Thibault Subject: [PATCH 19/29] stubdom: extend xenstore stubdom configs Date: Wed, 1 Nov 2023 10:33:15 +0100 Message-Id: <20231101093325.30302-20-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Extend the config files of the Xenstore stubdoms to include XENBUS and 9PFRONT items in order to support file based logging. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- stubdom/xenstore-minios.cfg | 2 +- stubdom/xenstorepvh-minios.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stubdom/xenstore-minios.cfg b/stubdom/xenstore-minios.cfg index a41704bb6b..239da519b9 100644 --- a/stubdom/xenstore-minios.cfg +++ b/stubdom/xenstore-minios.cfg @@ -3,7 +3,7 @@ CONFIG_NETFRONT=n CONFIG_FBFRONT=n CONFIG_KBDFRONT=n CONFIG_CONSFRONT=n -CONFIG_XENBUS=n CONFIG_LWIP=n +CONFIG_9PFRONT=y CONFIG_BALLOON=y XEN_INTERFACE_VERSION=__XEN_LATEST_INTERFACE_VERSION__ diff --git a/stubdom/xenstorepvh-minios.cfg b/stubdom/xenstorepvh-minios.cfg index 6af51f5753..752b90d7d3 100644 --- a/stubdom/xenstorepvh-minios.cfg +++ b/stubdom/xenstorepvh-minios.cfg @@ -4,7 +4,7 @@ CONFIG_NETFRONT=n CONFIG_FBFRONT=n CONFIG_KBDFRONT=n CONFIG_CONSFRONT=n -CONFIG_XENBUS=n CONFIG_LWIP=n +CONFIG_9PFRONT=y CONFIG_BALLOON=y XEN_INTERFACE_VERSION=__XEN_LATEST_INTERFACE_VERSION__ From patchwork Wed Nov 1 09:33:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442682 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 C3C64C4332F for ; Wed, 1 Nov 2023 09:46:14 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626286.976418 (Exim 4.92) (envelope-from ) id 1qy7nR-0006KG-R8; Wed, 01 Nov 2023 09:45:57 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626286.976418; Wed, 01 Nov 2023 09:45:57 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7nR-0006K9-O6; Wed, 01 Nov 2023 09:45:57 +0000 Received: by outflank-mailman (input) for mailman id 626286; Wed, 01 Nov 2023 09:45:56 +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 1qy7dC-0005sN-4K for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:22 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [2001:67c:2178:6::1d]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id f94e2189-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:35:20 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 390291F750; Wed, 1 Nov 2023 09:35:20 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 0911B13460; Wed, 1 Nov 2023 09:35:20 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 0vbUANgbQmVpCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:20 +0000 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: f94e2189-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831320; h=from:from:reply-to: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=7wErX+mI9M5W1zZSMWgX1THrvuDdFvzbJX+7TeHAugY=; b=M8XlYDPCIN4yQI7dVhoSv4MdaPN+uTAMQJ/C7Ahk02piswSTH+LMe0Ym9QORIQuBQKk8ly DFfgeOODy7P9tSKFg/xAASLd8SSb7z8xpMRNrhi37+fHQFm5dqp/9GypFZUgMo/imV1ave G7T7FhzT3q0rIQn3ll6HNLk/12dI+mk= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 20/29] tools: add 9pfs device to xenstore-stubdom Date: Wed, 1 Nov 2023 10:33:16 +0100 Message-Id: <20231101093325.30302-21-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add a 9pfs device to Xenstore stubdom in order to allow it to do e.g. logging into a dom0 file. Use the following parameters for the new device: - tag = "xen" - type = "xenlogd" - path = "/var/lib/xen/xenstore" For now don't limit allowed file space or number of files. Add a new libxl function for adding it similar to the function for adding the console device. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/helpers/init-xenstore-domain.c | 2 ++ tools/include/libxl.h | 17 ++++++++++++++++ tools/libs/light/libxl_9pfs.c | 29 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c index 140ed610ae..a65abae2ac 100644 --- a/tools/helpers/init-xenstore-domain.c +++ b/tools/helpers/init-xenstore-domain.c @@ -543,6 +543,8 @@ int main(int argc, char** argv) } libxl_console_add_xenstore(ctx, domid, 0, console_evtchn, console_gfn, NULL); + libxl_p9_add_xenstore(ctx, domid, 0, LIBXL_P9_TYPE_XENLOGD, "xen", + XEN_LIB_DIR"/xenstore", 0, 0, 0, 0, NULL); libxl_ctx_free(ctx); fd = creat(XEN_RUN_DIR "/xenstored.pid", 0666); diff --git a/tools/include/libxl.h b/tools/include/libxl.h index 907aa0a330..ab8a67f50a 100644 --- a/tools/include/libxl.h +++ b/tools/include/libxl.h @@ -583,6 +583,13 @@ * libxl_console_add_xenstore() in libxl. */ #define LIBXL_HAVE_CONSOLE_ADD_XENSTORE 1 + +/* + * LIBXL_HAVE_P9_ADD_XENSTORE indicates presence of the function + * libxl_p9_add_xenstore() in libxl. + */ +#define LIBXL_HAVE_P9_ADD_XENSTORE 1 + /* * libxl ABI compatibility * @@ -2060,6 +2067,16 @@ int libxl_console_add_xenstore(libxl_ctx *ctx, uint32_t domid, uint32_t backend, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; +/* libxl_p9_add_xenstore writes the Xenstore entries for a domain's + * primary 9pfs device based on domid, backend type and device parameters. + */ +int libxl_p9_add_xenstore(libxl_ctx *ctx, uint32_t domid, uint32_t backend, + libxl_p9_type type, char *tag, char *path, + unsigned int max_space, unsigned int max_files, + unsigned int max_open_files, bool auto_delete, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; + /* May be called with info_r == NULL to check for domain's existence. * Returns ERROR_DOMAIN_NOTFOUND if domain does not exist (used to return * ERROR_INVAL for this scenario). */ diff --git a/tools/libs/light/libxl_9pfs.c b/tools/libs/light/libxl_9pfs.c index 0b9d84dce9..3297389493 100644 --- a/tools/libs/light/libxl_9pfs.c +++ b/tools/libs/light/libxl_9pfs.c @@ -174,6 +174,35 @@ static void libxl__device_p9_add(libxl__egc *egc, uint32_t domid, aodev->callback(egc, aodev); } +int libxl_p9_add_xenstore(libxl_ctx *ctx, uint32_t domid, uint32_t backend, + libxl_p9_type type, char *tag, char *path, + unsigned int max_space, unsigned int max_files, + unsigned int max_open_files, bool auto_delete, + const libxl_asyncop_how *ao_how) +{ + AO_CREATE(ctx, domid, ao_how); + libxl__ao_device *aodev; + libxl_device_p9 p9 = { .backend_domid = backend, + .tag = tag, + .path = path, + .security_model = "none", + .type = type, + .max_space = max_space, + .max_files = max_files, + .max_open_files = max_open_files, + .auto_delete = auto_delete, + }; + + GCNEW(aodev); + libxl__prepare_ao_device(ao, aodev); + aodev->action = LIBXL__DEVICE_ACTION_ADD; + aodev->callback = device_addrm_aocomplete; + + libxl__device_p9_add(egc, domid, &p9, aodev); + + return AO_INPROGRESS; +} + #define libxl_device_p9_list NULL #define libxl_device_p9_compare NULL From patchwork Wed Nov 1 09:33:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442681 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 8A37EC4332F for ; Wed, 1 Nov 2023 09:46:08 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626287.976425 (Exim 4.92) (envelope-from ) id 1qy7nS-0006MB-5W; Wed, 01 Nov 2023 09:45:58 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626287.976425; Wed, 01 Nov 2023 09:45:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7nR-0006Ls-Uw; Wed, 01 Nov 2023 09:45:57 +0000 Received: by outflank-mailman (input) for mailman id 626287; Wed, 01 Nov 2023 09:45:56 +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 1qy7dH-0005sN-J1 for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:27 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id fc9c9d34-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:35:26 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id C002521A34; Wed, 1 Nov 2023 09:35:25 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 94B2A13460; Wed, 1 Nov 2023 09:35:25 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 9JLwIt0bQmV3CQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:25 +0000 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: fc9c9d34-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831325; h=from:from:reply-to: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=8BjSz724hO0UHJzaR9rl8p5uGL31/PkIonv1NOwSIio=; b=fo8fYOp99g80x3D+Weo/P6nTROfs8yQHVNg3vlyLtfzZX1WG1a4mgB+93JkQ1CZ9LfxjiZ um2SA8Y4U2lvp6S3iD1d96DaUvT0VL7gcd3/+Mg9ocvrV1ggmSgl/hdFYJPnLdsS5jWvvN pKzjvgHwY3uqgul3P5lo+iebH2pJVZQ= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 21/29] tools: tell xenstore-stubdom its own domid Date: Wed, 1 Nov 2023 10:33:17 +0100 Message-Id: <20231101093325.30302-22-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Pass the domid as a boot parameter when starting xenstore-stubdom. It will be needed to administrate its own Xenstore entries. Signed-off-by: Juergen Gross --- tools/helpers/init-xenstore-domain.c | 4 ++-- tools/xenstored/core.c | 9 +++++++++ tools/xenstored/core.h | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c index a65abae2ac..718cb3ba4e 100644 --- a/tools/helpers/init-xenstore-domain.c +++ b/tools/helpers/init-xenstore-domain.c @@ -240,9 +240,9 @@ static int build(xc_interface *xch) } if ( param ) - snprintf(cmdline, 512, "--event %d %s", rv, param); + snprintf(cmdline, 512, "--event %d --domid %u %s", rv, domid, param); else - snprintf(cmdline, 512, "--event %d", rv); + snprintf(cmdline, 512, "--event %d --domid %u", rv, domid); dom->guest_domid = domid; dom->cmdline = xc_dom_strdup(dom, cmdline); diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c index edd07711db..bb4612455d 100644 --- a/tools/xenstored/core.c +++ b/tools/xenstored/core.c @@ -2732,12 +2732,16 @@ static struct option options[] = { { "watch-nb", 1, NULL, 'W' }, #ifndef NO_LIVE_UPDATE { "live-update", 0, NULL, 'U' }, +#endif +#ifdef __MINIOS__ + { "domid", 1, NULL, 2 }, #endif { NULL, 0, NULL, 0 } }; int dom0_domid = 0; int dom0_event = 0; int priv_domid = 0; +int stub_domid = -1; static unsigned int get_optval_uint(const char *arg) { @@ -2927,6 +2931,11 @@ int main(int argc, char *argv[]) case 'U': live_update = true; break; +#endif +#ifdef __MINIOS__ + case 2: + stub_domid = get_optval_uint(optarg); + break; #endif } } diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h index 480b0f5f7b..f7a27a4131 100644 --- a/tools/xenstored/core.h +++ b/tools/xenstored/core.h @@ -359,6 +359,7 @@ do { \ extern int dom0_domid; extern int dom0_event; extern int priv_domid; +extern int stub_domid; extern bool keep_orphans; extern unsigned int timeout_watch_event_msec; From patchwork Wed Nov 1 09:33:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442699 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 49714C4332F for ; Wed, 1 Nov 2023 09:52:20 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626324.976508 (Exim 4.92) (envelope-from ) id 1qy7tP-0004nn-GM; Wed, 01 Nov 2023 09:52:07 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626324.976508; Wed, 01 Nov 2023 09:52:07 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7tP-0004nb-DL; Wed, 01 Nov 2023 09:52:07 +0000 Received: by outflank-mailman (input) for mailman id 626324; Wed, 01 Nov 2023 09:52:06 +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 1qy7dN-0005sN-4j for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:33 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id fff1a2fc-7899-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:35:31 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 5C6871F74A; Wed, 1 Nov 2023 09:35:31 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 2E60313460; Wed, 1 Nov 2023 09:35:31 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id u+HeCeMbQmWACQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:31 +0000 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: fff1a2fc-7899-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831331; h=from:from:reply-to: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=7ZIjSKw8myBsIFjSSoI4w5XeJBIQplDz3TdYVJIan38=; b=odwvP5Nmf8Gbt17WQoUgIELGUWVXw5tQu0g3JtB/nfDR7oN+SDGeRVyUzzx73iGnNKA1sJ yqhWvUCMVaHvDeyzpVHI0TXsAMhrCNkanQnsKU/Da4CFgbfLpxqUZ6q1UQ+gAhb2LISiId J1UMjBJ2Vhjwc4dV6Y3PJE9uEVgVF4M= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 22/29] tools/xenstored: Date: Wed, 1 Nov 2023 10:33:18 +0100 Message-Id: <20231101093325.30302-23-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 When [un]mapping the ring page of a Xenstore client, different actions are required for "normal" guests and dom0. Today this distinction is made at call site. Move this distinction into [un]map_interface() instead, avoiding code duplication and preparing special handling for [un]mapping the stub domain's ring page. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenstored/domain.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c index 6ef136e01f..58b0942043 100644 --- a/tools/xenstored/domain.c +++ b/tools/xenstored/domain.c @@ -497,14 +497,20 @@ static const struct interface_funcs domain_funcs = { static void *map_interface(domid_t domid) { + if (domid == xenbus_master_domid()) + return xenbus_map(); + return xengnttab_map_grant_ref(*xgt_handle, domid, GNTTAB_RESERVED_XENSTORE, PROT_READ|PROT_WRITE); } -static void unmap_interface(void *interface) +static void unmap_interface(domid_t domid, void *interface) { - xengnttab_unmap(*xgt_handle, interface, 1); + if (domid == xenbus_master_domid()) + unmap_xenbus(interface); + else + xengnttab_unmap(*xgt_handle, interface, 1); } static int domain_tree_remove_sub(const void *ctx, struct connection *conn, @@ -594,14 +600,8 @@ static int destroy_domain(void *_domain) eprintf("> Unbinding port %i failed!\n", domain->port); } - if (domain->interface) { - /* Domain 0 was mapped by dom0_init, so it must be unmapped - using munmap() and not the grant unmap call. */ - if (domain->domid == dom0_domid) - unmap_xenbus(domain->interface); - else - unmap_interface(domain->interface); - } + if (domain->interface) + unmap_interface(domain->domid, domain->interface); fire_special_watches("@releaseDomain"); @@ -966,18 +966,13 @@ static struct domain *introduce_domain(const void *ctx, return NULL; if (!domain->introduced) { - interface = is_master_domain ? xenbus_map() - : map_interface(domid); + interface = map_interface(domid); if (!interface && !restore) return NULL; if (new_domain(domain, port, restore)) { rc = errno; - if (interface) { - if (is_master_domain) - unmap_xenbus(interface); - else - unmap_interface(interface); - } + if (interface) + unmap_interface(domid, interface); errno = rc; return NULL; } From patchwork Wed Nov 1 09:33:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442704 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 144F5C4332F for ; Wed, 1 Nov 2023 09:54:18 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626344.976559 (Exim 4.92) (envelope-from ) id 1qy7vD-0008Eh-VW; Wed, 01 Nov 2023 09:53:59 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626344.976559; Wed, 01 Nov 2023 09:53:59 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7vD-0008Ea-SH; Wed, 01 Nov 2023 09:53:59 +0000 Received: by outflank-mailman (input) for mailman id 626344; Wed, 01 Nov 2023 09:53:58 +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 1qy7dR-0005E0-Le for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:37 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 03512e42-789a-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:35:37 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id EB8441F74A; Wed, 1 Nov 2023 09:35:36 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id BE2A013460; Wed, 1 Nov 2023 09:35:36 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id bDcDLegbQmWICQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:36 +0000 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: 03512e42-789a-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831336; h=from:from:reply-to: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=RQ78E8HS1n1N0QHhM7YQ5dj02t//jI6MdPWceDYsOps=; b=bRBS1tJphNVYmRRl0SOjs91AtWymp4pqnQCJ30/2/NVHfu3Lgtvw+JpmtY9ru98KiKakm4 k0nJ51OVMJVOLzGKgGJLYh8SXHXjzTuGNmV86Wi8aL2L5kyvZ1d4dftflG52FncrrGIXDY MvEMVXLzAGyVpbvFFIRb6MncRWeYvKg= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 23/29] tools/xenstored: split domain_init() Date: Wed, 1 Nov 2023 10:33:19 +0100 Message-Id: <20231101093325.30302-24-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Today domain_init() is called either just before calling dom0_init() in case no live update is being performed, or it is called after reading the global state from read_state_global(), as the event channel fd is needed. Split up domain_init() into a preparation part which can be called unconditionally, and in a part setting up the event channel handle. Note that there is no chance that chk_domain_generation() can be called now before xc_handle has been setup, so there is no need for the related special case anymore. Signed-off-by: Juergen Gross --- tools/xenstored/core.c | 2 ++ tools/xenstored/domain.c | 12 ++++++------ tools/xenstored/domain.h | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c index bb4612455d..42a848e098 100644 --- a/tools/xenstored/core.c +++ b/tools/xenstored/core.c @@ -2972,6 +2972,8 @@ int main(int argc, char *argv[]) init_pipe(reopen_log_pipe); + domain_static_init(); + /* Listen to hypervisor. */ if (!no_domain_init && !live_update) { domain_init(-1); diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c index 58b0942043..fa17f68618 100644 --- a/tools/xenstored/domain.c +++ b/tools/xenstored/domain.c @@ -1224,10 +1224,8 @@ static int domeq_fn(const void *key1, const void *key2) return *(const unsigned int *)key1 == *(const unsigned int *)key2; } -void domain_init(int evtfd) +void domain_static_init(void) { - int rc; - /* Start with a random rather low domain count for the hashtable. */ domhash = create_hashtable(NULL, "domains", domhash_fn, domeq_fn, 0); if (!domhash) @@ -1258,6 +1256,11 @@ void domain_init(int evtfd) xengnttab_set_max_grants(*xgt_handle, DOMID_FIRST_RESERVED); talloc_set_destructor(xgt_handle, close_xgt_handle); +} + +void domain_init(int evtfd) +{ + int rc; if (evtfd < 0) xce_handle = xenevtchn_open(NULL, XENEVTCHN_NO_CLOEXEC); @@ -1291,9 +1294,6 @@ static bool chk_domain_generation(unsigned int domid, uint64_t gen) { struct domain *d; - if (!xc_handle && domid == dom0_domid) - return true; - d = find_domain_struct(domid); return d && d->generation <= gen; diff --git a/tools/xenstored/domain.h b/tools/xenstored/domain.h index 7625dca8cd..6c00540311 100644 --- a/tools/xenstored/domain.h +++ b/tools/xenstored/domain.h @@ -82,6 +82,7 @@ int do_get_domain_path(const void *ctx, struct connection *conn, int do_reset_watches(const void *ctx, struct connection *conn, struct buffered_data *in); +void domain_static_init(void); void domain_init(int evtfd); void dom0_init(void); void domain_deinit(void); From patchwork Wed Nov 1 09:33:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442680 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 6400AC4332F for ; Wed, 1 Nov 2023 09:45:13 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626284.976409 (Exim 4.92) (envelope-from ) id 1qy7mZ-0005cY-Iw; Wed, 01 Nov 2023 09:45:03 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626284.976409; Wed, 01 Nov 2023 09:45: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 1qy7mZ-0005cR-Fc; Wed, 01 Nov 2023 09:45:03 +0000 Received: by outflank-mailman (input) for mailman id 626284; Wed, 01 Nov 2023 09:45:02 +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 1qy7dY-0005sN-B4 for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:44 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 069ec3a6-789a-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:35:42 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 8D7911F74A; Wed, 1 Nov 2023 09:35:42 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 6359013460; Wed, 1 Nov 2023 09:35:42 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id BLzeFu4bQmWVCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:42 +0000 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: 069ec3a6-789a-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831342; h=from:from:reply-to: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=9rPMG1ixXzf2IlhhL0e9vKDBwC7X+7yW2VUn/FHK77E=; b=MadOtAbpasQPT2UQvChyyZIE/nnC/GeBOEC1jTkR6TzwzKHoqkVynqAQ2Lku8WndMgos2c /6Mo6jTOOebpyEu29GYd5k7pssWFMe2KhCYMe95cX8qlZsJ06C/MtVXwPKA3KByELVOxLH REO/4aH7P4DMV7mjQfg8hD2QpStUnyM= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 24/29] tools/xenstored: map stubdom interface Date: Wed, 1 Nov 2023 10:33:20 +0100 Message-Id: <20231101093325.30302-25-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 When running as stubdom, map the stubdom's Xenstore ring page in order to support using the 9pfs frontend. Signed-off-by: Juergen Gross --- tools/xenstored/core.c | 2 ++ tools/xenstored/domain.c | 27 ++++++++++++++++++++++++++- tools/xenstored/domain.h | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c index 42a848e098..1764b1af4e 100644 --- a/tools/xenstored/core.c +++ b/tools/xenstored/core.c @@ -3003,6 +3003,8 @@ int main(int argc, char *argv[]) lu_read_state(); #endif + stubdom_init(); + check_store(); /* Get ready to listen to the tools. */ diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c index fa17f68618..162b87b460 100644 --- a/tools/xenstored/domain.c +++ b/tools/xenstored/domain.c @@ -37,6 +37,10 @@ #include #include +#ifdef __MINIOS__ +#include +#endif + static xc_interface **xc_handle; xengnttab_handle **xgt_handle; static evtchn_port_t virq_port; @@ -500,6 +504,11 @@ static void *map_interface(domid_t domid) if (domid == xenbus_master_domid()) return xenbus_map(); +#ifdef __MINIOS__ + if (domid == stub_domid) + return xenstore_buf; +#endif + return xengnttab_map_grant_ref(*xgt_handle, domid, GNTTAB_RESERVED_XENSTORE, PROT_READ|PROT_WRITE); @@ -509,7 +518,7 @@ static void unmap_interface(domid_t domid, void *interface) { if (domid == xenbus_master_domid()) unmap_xenbus(interface); - else + else if (domid != stub_domid) xengnttab_unmap(*xgt_handle, interface, 1); } @@ -1214,6 +1223,22 @@ void dom0_init(void) xenevtchn_notify(xce_handle, dom0->port); } +void stubdom_init(void) +{ +#ifdef __MINIOS__ + struct domain *stubdom; + + if (stub_domid < 0) + return; + + stubdom = introduce_domain(NULL, stub_domid, xenbus_evtchn, false); + if (!stubdom) + barf_perror("Failed to initialize stubdom"); + + xenevtchn_notify(xce_handle, stubdom->port); +#endif +} + static unsigned int domhash_fn(const void *k) { return *(const unsigned int *)k; diff --git a/tools/xenstored/domain.h b/tools/xenstored/domain.h index 6c00540311..49c60c56bf 100644 --- a/tools/xenstored/domain.h +++ b/tools/xenstored/domain.h @@ -85,6 +85,7 @@ int do_reset_watches(const void *ctx, struct connection *conn, void domain_static_init(void); void domain_init(int evtfd); void dom0_init(void); +void stubdom_init(void); void domain_deinit(void); void ignore_connection(struct connection *conn, unsigned int err); From patchwork Wed Nov 1 09:33:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442679 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 88923C001B5 for ; Wed, 1 Nov 2023 09:43:56 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626281.976399 (Exim 4.92) (envelope-from ) id 1qy7lA-0004rN-9X; Wed, 01 Nov 2023 09:43:36 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626281.976399; Wed, 01 Nov 2023 09:43:36 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7lA-0004rG-6G; Wed, 01 Nov 2023 09:43:36 +0000 Received: by outflank-mailman (input) for mailman id 626281; Wed, 01 Nov 2023 09:43:34 +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 1qy7dc-0005E0-SC for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:48 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 09ffa01c-789a-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:35:48 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 2A5291F74A; Wed, 1 Nov 2023 09:35:48 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id F2EC813460; Wed, 1 Nov 2023 09:35:47 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id Nw32OfMbQmWbCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:47 +0000 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: 09ffa01c-789a-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831348; h=from:from:reply-to: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=Tql+TwCFijc3h7ziLqKYIH9oAU5Ll8hidyNHEMqapi8=; b=tf7oOnno8VcyQjNgDDdCvapvHU1C0OEkpFM44RMBVHYVi3DFKOdHulwj2aNhbBqjE7xo0c kscb0hjhSIhvKNK7RAvnL5424iCWY0XQMWLx5e2l9C3vzGs+QcSdArdpyPe5laET9Tbfan DFu5CcbwESWCvybaaspba7xiwzmO5+s= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 25/29] tools/xenstored: mount 9pfs device in stubdom Date: Wed, 1 Nov 2023 10:33:21 +0100 Message-Id: <20231101093325.30302-26-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Mount the 9pfs device in stubdom enabling it to use files. This has to happen in a worker thread in order to allow the main thread handling the required Xenstore accesses in parallel. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenstored/core.h | 5 +++++ tools/xenstored/domain.c | 2 ++ tools/xenstored/minios.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h index f7a27a4131..48ff659ec5 100644 --- a/tools/xenstored/core.h +++ b/tools/xenstored/core.h @@ -35,6 +35,8 @@ #include "list.h" #include "hashtable.h" +#define XENSTORE_LIB_DIR XEN_LIB_DIR "/xenstore" + #ifndef O_CLOEXEC #define O_CLOEXEC 0 /* O_CLOEXEC support is needed for Live Update in the daemon case. */ @@ -385,6 +387,9 @@ static inline bool domain_is_unprivileged(const struct connection *conn) /* Return the event channel used by xenbus. */ evtchn_port_t get_xenbus_evtchn(void); +#ifdef __MINIOS__ +void mount_9pfs(void); +#endif /* Write out the pidfile */ void write_pidfile(const char *pidfile); diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c index 162b87b460..4263c1360f 100644 --- a/tools/xenstored/domain.c +++ b/tools/xenstored/domain.c @@ -1236,6 +1236,8 @@ void stubdom_init(void) barf_perror("Failed to initialize stubdom"); xenevtchn_notify(xce_handle, stubdom->port); + + mount_9pfs(); #endif } diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c index 0779efbf91..e5a3684df6 100644 --- a/tools/xenstored/minios.c +++ b/tools/xenstored/minios.c @@ -19,6 +19,14 @@ #include #include "core.h" #include +#include +#include +#include +#include + +#define P9_STATE_PATH "device/9pfs/0/state" + +static void *p9_device; void write_pidfile(const char *pidfile) { @@ -54,3 +62,30 @@ void unmap_xenbus(void *interface) xengnttab_unmap(*xgt_handle, interface, 1); } +static void mount_thread(void *p) +{ + xenbus_event_queue events = NULL; + char *err; + char *dummy; + + free(xenbus_watch_path_token(XBT_NIL, P9_STATE_PATH, "9pfs", &events)); + + for (;;) { + xenbus_wait_for_watch(&events); + err = xenbus_read(XBT_NIL, P9_STATE_PATH, &dummy); + if (!err) + break; + free(err); + } + + free(dummy); + + free(xenbus_unwatch_path_token(XBT_NIL, P9_STATE_PATH, "9pfs")); + + p9_device = init_9pfront(0, XENSTORE_LIB_DIR); +} + +void mount_9pfs(void) +{ + create_thread("mount-9pfs", mount_thread, NULL); +} From patchwork Wed Nov 1 09:33:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442696 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 1A6C0C4332F for ; Wed, 1 Nov 2023 09:50:54 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626315.976479 (Exim 4.92) (envelope-from ) id 1qy7ry-0002tp-LN; Wed, 01 Nov 2023 09:50:38 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626315.976479; Wed, 01 Nov 2023 09:50:38 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7ry-0002ti-HN; Wed, 01 Nov 2023 09:50:38 +0000 Received: by outflank-mailman (input) for mailman id 626315; Wed, 01 Nov 2023 09:50:36 +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 1qy7di-0005E0-KQ for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:54 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 0d53b678-789a-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:35:54 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B5C2A1F74A; Wed, 1 Nov 2023 09:35:53 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 8814D13460; Wed, 1 Nov 2023 09:35:53 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id WHvNH/kbQmWoCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:53 +0000 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: 0d53b678-789a-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831353; h=from:from:reply-to: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=O8ibJTSvpdBw5QYEwaYDmGyzTvOSMmm8TeHf7YRE1kM=; b=NYPZa+Qtfa6ex1QlDJbLznL9uTxygKINAzDvHcaSd7HR9tN2w136SHDzRvvt+HJhXXOJR4 4Y22JZdLc4JC+hqPZnA3p5Bzw8sI29uD3iV338qi9Zmy6jam6KZUq/7IUSU+powDzybeX4 OaCxlTf9M6X+uOyoowsh2PVDYZpwlHQ= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 26/29] tools/xenstored: add helpers for filename handling Date: Wed, 1 Nov 2023 10:33:22 +0100 Message-Id: <20231101093325.30302-27-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Add some helpers for handling filenames which might need different implementations between stubdom and daemon environments: - expansion of relative filenames (those are not really defined today, just expand them to be relative to /var/lib/xen/xenstore) - expansion of xenstore_daemon_rundir() (used e.g. for saving the state file in case of live update - needs to be unchanged in the daemon case, but should result in /var/lib/xen/xenstore for stubdom) Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenstored/core.c | 9 ++++++++- tools/xenstored/core.h | 3 +++ tools/xenstored/lu_daemon.c | 4 ++-- tools/xenstored/minios.c | 5 +++++ tools/xenstored/posix.c | 6 ++++++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c index 1764b1af4e..9f48d91027 100644 --- a/tools/xenstored/core.c +++ b/tools/xenstored/core.c @@ -158,6 +158,13 @@ void trace_destroy(const void *data, const char *type) trace("obj: DESTROY %s %p\n", type, data); } +char *absolute_filename(const void *ctx, const char *filename) +{ + if (filename[0] != '/') + return talloc_asprintf(ctx, XENSTORE_LIB_DIR "/%s", filename); + return talloc_strdup(ctx, filename); +} + /** * Signal handler for SIGHUP, which requests that the trace log is reopened * (in the main loop). A single byte is written to reopen_log_pipe, to awaken @@ -2995,7 +3002,7 @@ int main(int argc, char *argv[]) signal(SIGHUP, trigger_reopen_log); if (tracefile) - tracefile = talloc_strdup(NULL, tracefile); + tracefile = absolute_filename(NULL, tracefile); #ifndef NO_LIVE_UPDATE /* Read state in case of live update. */ diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h index 48ff659ec5..d3cd4a4c8a 100644 --- a/tools/xenstored/core.h +++ b/tools/xenstored/core.h @@ -391,6 +391,9 @@ evtchn_port_t get_xenbus_evtchn(void); void mount_9pfs(void); #endif +const char *xenstore_rundir(void); +char *absolute_filename(const void *ctx, const char *filename); + /* Write out the pidfile */ void write_pidfile(const char *pidfile); diff --git a/tools/xenstored/lu_daemon.c b/tools/xenstored/lu_daemon.c index 71bcabadd3..6351111ab0 100644 --- a/tools/xenstored/lu_daemon.c +++ b/tools/xenstored/lu_daemon.c @@ -24,7 +24,7 @@ void lu_get_dump_state(struct lu_dump_state *state) state->size = 0; state->filename = talloc_asprintf(NULL, "%s/state_dump", - xenstore_daemon_rundir()); + xenstore_rundir()); if (!state->filename) barf("Allocation failure"); @@ -65,7 +65,7 @@ FILE *lu_dump_open(const void *ctx) int fd; filename = talloc_asprintf(ctx, "%s/state_dump", - xenstore_daemon_rundir()); + xenstore_rundir()); if (!filename) return NULL; diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c index e5a3684df6..104f37587b 100644 --- a/tools/xenstored/minios.c +++ b/tools/xenstored/minios.c @@ -89,3 +89,8 @@ void mount_9pfs(void) { create_thread("mount-9pfs", mount_thread, NULL); } + +const char *xenstore_rundir(void) +{ + return XENSTORE_LIB_DIR; +} diff --git a/tools/xenstored/posix.c b/tools/xenstored/posix.c index 7e03dd982d..d02d0e446f 100644 --- a/tools/xenstored/posix.c +++ b/tools/xenstored/posix.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "utils.h" #include "core.h" @@ -157,3 +158,8 @@ void *xenbus_map(void) return addr; } + +const char *xenstore_rundir(void) +{ + return xenstore_daemon_rundir(); +} From patchwork Wed Nov 1 09:33:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442695 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 D4476C4332F for ; Wed, 1 Nov 2023 09:50:11 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626309.976468 (Exim 4.92) (envelope-from ) id 1qy7rK-0001Ro-Cc; Wed, 01 Nov 2023 09:49:58 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626309.976468; Wed, 01 Nov 2023 09:49:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7rK-0001Rh-9S; Wed, 01 Nov 2023 09:49:58 +0000 Received: by outflank-mailman (input) for mailman id 626309; Wed, 01 Nov 2023 09:49:57 +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 1qy7dn-0005E0-Vi for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:35:59 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 10a643c7-789a-11ee-98d6-6d05b1d4d9a1; Wed, 01 Nov 2023 10:35:59 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 4FE9621846; Wed, 1 Nov 2023 09:35:59 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 22A6013460; Wed, 1 Nov 2023 09:35:59 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id XNstB/8bQmWxCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:35:59 +0000 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: 10a643c7-789a-11ee-98d6-6d05b1d4d9a1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831359; h=from:from:reply-to: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=VvPBJlyg+rtDKl5QJN43vNqPqvgJfq1ZXkp/nXSGa04=; b=BPZ84pRdrc1OTDb05gU7LEVcyGAmzcXl35NBc2rld6cmfAo8qOcXvu9IoOfzQYy2Y7cIIj xPop956+noIIGOQs7fqybUOzNc+2B8tJ060n4uzrxGMIq7suBgwLGs7zVH7nDjEOLU7KJK BKhHIv3pr94aYyDubRwop3JjZaKDmJI= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 27/29] tools/xenstored: add daemon_init() function Date: Wed, 1 Nov 2023 10:33:23 +0100 Message-Id: <20231101093325.30302-28-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 Some xenstored initialization needs to be done in the daemon case only, so split it out into a new daemon_init() function being a stub in the stubdom case. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenstored/core.c | 6 +----- tools/xenstored/core.h | 1 + tools/xenstored/minios.c | 4 ++++ tools/xenstored/posix.c | 10 ++++++++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c index 9f48d91027..204b932ca9 100644 --- a/tools/xenstored/core.c +++ b/tools/xenstored/core.c @@ -2949,11 +2949,7 @@ int main(int argc, char *argv[]) if (optind != argc) barf("%s: No arguments desired", argv[0]); - reopen_log(); - - /* Make sure xenstored directory exists. */ - /* Errors ignored here, will be reported when we open files */ - mkdir(xenstore_daemon_rundir(), 0755); + daemon_init(); if (dofork) { openlog("xenstored", 0, LOG_DAEMON); diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h index d3cd4a4c8a..a15d5b0d67 100644 --- a/tools/xenstored/core.h +++ b/tools/xenstored/core.h @@ -391,6 +391,7 @@ evtchn_port_t get_xenbus_evtchn(void); void mount_9pfs(void); #endif +void daemon_init(void); const char *xenstore_rundir(void); char *absolute_filename(const void *ctx, const char *filename); diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c index 104f37587b..cd6e288f2a 100644 --- a/tools/xenstored/minios.c +++ b/tools/xenstored/minios.c @@ -62,6 +62,10 @@ void unmap_xenbus(void *interface) xengnttab_unmap(*xgt_handle, interface, 1); } +void daemon_init(void) +{ +} + static void mount_thread(void *p) { xenbus_event_queue events = NULL; diff --git a/tools/xenstored/posix.c b/tools/xenstored/posix.c index d02d0e446f..c84e7ef3a8 100644 --- a/tools/xenstored/posix.c +++ b/tools/xenstored/posix.c @@ -163,3 +163,13 @@ const char *xenstore_rundir(void) { return xenstore_daemon_rundir(); } + +void daemon_init(void) +{ + reopen_log(); + + /* Make sure xenstored directories exist. */ + /* Errors ignored here, will be reported when we open files */ + mkdir(xenstore_daemon_rundir(), 0755); + mkdir(XENSTORE_LIB_DIR, 0755); +} From patchwork Wed Nov 1 09:33:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442692 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 CE27FC4332F for ; Wed, 1 Nov 2023 09:47:10 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626293.976438 (Exim 4.92) (envelope-from ) id 1qy7oM-0007Vu-By; Wed, 01 Nov 2023 09:46:54 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626293.976438; Wed, 01 Nov 2023 09:46:54 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7oM-0007Vn-8g; Wed, 01 Nov 2023 09:46:54 +0000 Received: by outflank-mailman (input) for mailman id 626293; Wed, 01 Nov 2023 09:46:53 +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 1qy7du-0005sN-Nv for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:36:06 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 13eeaff0-789a-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:36:05 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id DEB551F74D; Wed, 1 Nov 2023 09:36:04 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id B20BD13460; Wed, 1 Nov 2023 09:36:04 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id xYQ6KgQcQmW7CQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:36:04 +0000 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: 13eeaff0-789a-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831364; h=from:from:reply-to: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=lu0WplxXTKB8e/O4GGP2IWT4s4QFFiu0mF15YaAuCzw=; b=O3+NbfMDna+vFQ2XWJgN1rmM5srwOzFktfaQ9c/LnBFT5XqW8wIR4hYNbSu7wD2DPsh6gA poG07fVQ88QpLNk/yROr7B/p7514019YgbwCryCXpvnmChgI/qXCGhjPFD3SEePnqSrXfe MqOEr8yb2xRCjvMkJFPwqkIu4TQbn9k= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Anthony PERARD , Julien Grall Subject: [PATCH 28/29] tools/xenstored: support complete log capabilities in stubdom Date: Wed, 1 Nov 2023 10:33:24 +0100 Message-Id: <20231101093325.30302-29-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 With 9pfs being fully available in Xenstore-stubdom now, there is no reason to not fully support all logging capabilities in stubdom. Open the logfile on stubdom only after the 9pfs file system has been mounted. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/hotplug/Linux/launch-xenstore.in | 1 + tools/xenstored/control.c | 30 +++++++++++++------------- tools/xenstored/minios.c | 3 +++ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/tools/hotplug/Linux/launch-xenstore.in b/tools/hotplug/Linux/launch-xenstore.in index e854ca1eb8..da4eeca7c5 100644 --- a/tools/hotplug/Linux/launch-xenstore.in +++ b/tools/hotplug/Linux/launch-xenstore.in @@ -98,6 +98,7 @@ test -f @CONFIG_DIR@/@CONFIG_LEAF_DIR@/xencommons && . @CONFIG_DIR@/@CONFIG_LEAF [ -z "$XENSTORE_DOMAIN_SIZE" ] && XENSTORE_DOMAIN_SIZE=8 XENSTORE_DOMAIN_ARGS="$XENSTORE_DOMAIN_ARGS --memory $XENSTORE_DOMAIN_SIZE" [ -z "$XENSTORE_MAX_DOMAIN_SIZE" ] || XENSTORE_DOMAIN_ARGS="$XENSTORE_DOMAIN_ARGS --maxmem $XENSTORE_MAX_DOMAIN_SIZE" + [ -z "$XENSTORED_TRACE" ] || XENSTORE_DOMAIN_ARGS="$XENSTORE_DOMAIN_ARGS -T xenstored-trace.log" echo -n Starting $XENSTORE_DOMAIN_KERNEL... ${LIBEXEC_BIN}/init-xenstore-domain $XENSTORE_DOMAIN_ARGS || exit 1 diff --git a/tools/xenstored/control.c b/tools/xenstored/control.c index b2f64d674f..dae23a5ac0 100644 --- a/tools/xenstored/control.c +++ b/tools/xenstored/control.c @@ -201,19 +201,6 @@ static int do_control_quota_s(const void *ctx, struct connection *conn, return EINVAL; } -#ifdef __MINIOS__ -static int do_control_memreport(const void *ctx, struct connection *conn, - const char **vec, int num) -{ - if (num) - return EINVAL; - - talloc_report_full(NULL, stdout); - - send_ack(conn, XS_CONTROL); - return 0; -} -#else static int do_control_logfile(const void *ctx, struct connection *conn, const char **vec, int num) { @@ -222,13 +209,26 @@ static int do_control_logfile(const void *ctx, struct connection *conn, close_log(); talloc_free(tracefile); - tracefile = talloc_strdup(NULL, vec[0]); + tracefile = absolute_filename(NULL, vec[0]); reopen_log(); send_ack(conn, XS_CONTROL); return 0; } +#ifdef __MINIOS__ +static int do_control_memreport(const void *ctx, struct connection *conn, + const char **vec, int num) +{ + if (num) + return EINVAL; + + talloc_report_full(NULL, stdout); + + send_ack(conn, XS_CONTROL); + return 0; +} +#else static int do_control_memreport(const void *ctx, struct connection *conn, const char **vec, int num) { @@ -309,10 +309,10 @@ static struct cmd_s cmds[] = { "[-c ] [-F] [-t ] \n" " Default timeout is 60 seconds.", 5 }, #endif + { "logfile", do_control_logfile, "" }, #ifdef __MINIOS__ { "memreport", do_control_memreport, "" }, #else - { "logfile", do_control_logfile, "" }, { "memreport", do_control_memreport, "[]" }, #endif { "print", do_control_print, "" }, diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c index cd6e288f2a..c02a263d9d 100644 --- a/tools/xenstored/minios.c +++ b/tools/xenstored/minios.c @@ -87,6 +87,9 @@ static void mount_thread(void *p) free(xenbus_unwatch_path_token(XBT_NIL, P9_STATE_PATH, "9pfs")); p9_device = init_9pfront(0, XENSTORE_LIB_DIR); + + /* Start logging if selected. */ + reopen_log(); } void mount_9pfs(void) From patchwork Wed Nov 1 09:33:25 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 13442706 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 2986CC4332F for ; Wed, 1 Nov 2023 09:54:37 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.626351.976584 (Exim 4.92) (envelope-from ) id 1qy7vg-00012N-R8; Wed, 01 Nov 2023 09:54:28 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 626351.976584; Wed, 01 Nov 2023 09:54:28 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qy7vg-00010a-Kq; Wed, 01 Nov 2023 09:54:28 +0000 Received: by outflank-mailman (input) for mailman id 626351; Wed, 01 Nov 2023 09:54:27 +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 1qy7e0-0005sN-Bj for xen-devel@lists.xenproject.org; Wed, 01 Nov 2023 09:36:12 +0000 Received: from smtp-out2.suse.de (smtp-out2.suse.de [2001:67c:2178:6::1d]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 17487220-789a-11ee-9b0e-b553b5be7939; Wed, 01 Nov 2023 10:36:10 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 822601F750; Wed, 1 Nov 2023 09:36:10 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4D36F13460; Wed, 1 Nov 2023 09:36:10 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id UXV4EQocQmXRCQAAMHmgww (envelope-from ); Wed, 01 Nov 2023 09:36:10 +0000 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: 17487220-789a-11ee-9b0e-b553b5be7939 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1698831370; h=from:from:reply-to: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=nYvyegEExGxpVyVevuNtSzRpcmdIFE44ODgb8U4L3Mw=; b=IvRzd0LiiImU0mfBCuFuNDX9S6iSYQ2NjakQUD61tGb8Oll4NzPwXb9+5PrhXvZv4jUY2u fAIKcDR6kxhpyU2dRg8nZwHhasA0+yUeqapcA+JCOX340TRuu4i3saqa1vLs2jQkGC6G6p lZUHlnUEvT1nXLjBJZcC6uMdg5bEkSI= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH 29/29] tools/xenstored: have a single do_control_memreport() Date: Wed, 1 Nov 2023 10:33:25 +0100 Message-Id: <20231101093325.30302-30-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231101093325.30302-1-jgross@suse.com> References: <20231101093325.30302-1-jgross@suse.com> MIME-Version: 1.0 With 9pfs now available in Xenstore-stubdom, there is no reason to have distinct do_control_memreport() variants for the daemon and the stubdom implementations. Signed-off-by: Juergen Gross Reviewed-by: Jason Andryuk --- tools/xenstored/control.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/tools/xenstored/control.c b/tools/xenstored/control.c index dae23a5ac0..7db2c4703b 100644 --- a/tools/xenstored/control.c +++ b/tools/xenstored/control.c @@ -216,23 +216,11 @@ static int do_control_logfile(const void *ctx, struct connection *conn, return 0; } -#ifdef __MINIOS__ -static int do_control_memreport(const void *ctx, struct connection *conn, - const char **vec, int num) -{ - if (num) - return EINVAL; - - talloc_report_full(NULL, stdout); - - send_ack(conn, XS_CONTROL); - return 0; -} -#else static int do_control_memreport(const void *ctx, struct connection *conn, const char **vec, int num) { FILE *fp; + char *filename; int fd; if (num > 1) @@ -255,8 +243,12 @@ static int do_control_memreport(const void *ctx, struct connection *conn, if (!fp) close(fd); } - } else - fp = fopen(vec[0], "a"); + } else { + filename = absolute_filename(ctx, vec[0]); + if (!filename) + return ENOMEM; + fp = fopen(filename, "a"); + } if (!fp) return EBADF; @@ -267,7 +259,6 @@ static int do_control_memreport(const void *ctx, struct connection *conn, send_ack(conn, XS_CONTROL); return 0; } -#endif static int do_control_print(const void *ctx, struct connection *conn, const char **vec, int num) @@ -310,11 +301,7 @@ static struct cmd_s cmds[] = { " Default timeout is 60 seconds.", 5 }, #endif { "logfile", do_control_logfile, "" }, -#ifdef __MINIOS__ - { "memreport", do_control_memreport, "" }, -#else { "memreport", do_control_memreport, "[]" }, -#endif { "print", do_control_print, "" }, { "quota", do_control_quota, "[set ||max [-r]]" },