From nobody Mon Feb 9 09:34:43 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=quarantine dis=none) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1680164249; cv=none; d=zohomail.com; s=zohoarc; b=eehq6vZBeFx153DlYOCwaongLmWJsG7kiM0TOSMP5pF31HMwc/8d3Z3ZPhi+Syj588Sy6OUYGIyVesRH5byUlQMfSXOaSUDMTeMIotcuPVf/YyfZ667Pnz/QNaerpo7cBNwjmA+cSqb7Zm/HDydnEr9pdCW7oOn0WeSkZyM0/00= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1680164249; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=da+NStUV6DXkF4btGUetsd/keYmApwMCJxZfSA0fyN8=; b=lnqIMb20V5Kl6GRcdlWSRSCUfIhKYBeo352DFD9TNMwxvoZTYUBZozcqqvldDiqbL/S3S+6KVO0Vt8KN9/jWm+kmFTjBaBSWqPSNVAQzTGbtQgpyPVTRnOFk9xd1V77QM4W6RZemnf/5KrfBwJZCT3Fe7IVjIIWuquqmDnC2DKg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1680164249973385.30060295986243; Thu, 30 Mar 2023 01:17:29 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.516452.800563 (Exim 4.92) (envelope-from ) id 1phnT0-0002XP-Dw; Thu, 30 Mar 2023 08:17:06 +0000 Received: by outflank-mailman (output) from mailman id 516452.800563; Thu, 30 Mar 2023 08:17:06 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1phnT0-0002Wa-9f; Thu, 30 Mar 2023 08:17:06 +0000 Received: by outflank-mailman (input) for mailman id 516452; Thu, 30 Mar 2023 08:17:05 +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 1phnSz-0001oz-24 for xen-devel@lists.xenproject.org; Thu, 30 Mar 2023 08:17:05 +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 40f980dd-ced3-11ed-85db-49a42c6b2330; Thu, 30 Mar 2023 10:17:04 +0200 (CEST) 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 1D7CA1FE98; Thu, 30 Mar 2023 08:17: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 E1BC4138FF; Thu, 30 Mar 2023 08:17:03 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id ksWuNX9FJWTrEQAAMHmgww (envelope-from ); Thu, 30 Mar 2023 08:17:03 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 40f980dd-ced3-11ed-85db-49a42c6b2330 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1680164224; 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=da+NStUV6DXkF4btGUetsd/keYmApwMCJxZfSA0fyN8=; b=CSlSGWeAgOI5ZDkK0Q18oikyT905sdGaGx8emdJ/cr35B7J53+cS15u7ocMhvZp8qgYqXK 9iThyT0X5ZgyJvwBALh+YV9X6et7a9W7mVyR0GbgrSsdk8fQ7Jn+3HvTM5h77n6ku5jBXJ G+oHFEqkyz5PqMbp8J54xNI7+YLqwIw= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Wei Liu , Julien Grall , Anthony PERARD Subject: [PATCH v3 03/13] tools/xenstore: introduce accounting data array for per-domain values Date: Thu, 30 Mar 2023 10:16:34 +0200 Message-Id: <20230330081644.11480-4-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20230330081644.11480-1-jgross@suse.com> References: <20230330081644.11480-1-jgross@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @suse.com) X-ZM-MESSAGEID: 1680164251590100001 Content-Type: text/plain; charset="utf-8" Introduce the scheme of an accounting data array for per-domain accounting data and use it initially for the number of nodes owned by a domain. Make the accounting data type to be unsigned int, as no data is allowed to be negative at any time. Signed-off-by: Juergen Gross --- V3: - remove domid parameter from domain_acc_add_chk() (Julien Grall) - rename domain_acc_add_chk() (Julien Grall) - modify overflow check (Julien Grall) --- tools/xenstore/xenstored_domain.c | 70 ++++++++++++++++++------------- tools/xenstore/xenstored_domain.h | 3 +- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/tools/xenstore/xenstored_domain.c b/tools/xenstore/xenstored_d= omain.c index 609a9a13ab..4ff01bac84 100644 --- a/tools/xenstore/xenstored_domain.c +++ b/tools/xenstore/xenstored_domain.c @@ -69,8 +69,8 @@ struct domain /* Has domain been officially introduced? */ bool introduced; =20 - /* number of entry from this domain in the store */ - int nbentry; + /* Accounting data for this domain. */ + unsigned int acc[ACC_N]; =20 /* Amount of memory allocated for this domain. */ int memory; @@ -246,7 +246,7 @@ static int domain_tree_remove_sub(const void *ctx, stru= ct connection *conn, =20 if (keep_orphans) { set_tdb_key(node->name, &key); - domain->nbentry--; + domain_nbentry_dec(NULL, domain->domid); node->perms.p[0].id =3D priv_domid; node->acc.memory =3D 0; domain_nbentry_inc(NULL, priv_domid); @@ -270,7 +270,7 @@ static int domain_tree_remove_sub(const void *ctx, stru= ct connection *conn, ret =3D WALK_TREE_SKIP_CHILDREN; } =20 - return domain->nbentry > 0 ? ret : WALK_TREE_SUCCESS_STOP; + return domain->acc[ACC_NODES] ? ret : WALK_TREE_SUCCESS_STOP; } =20 static void domain_tree_remove(struct domain *domain) @@ -278,7 +278,7 @@ static void domain_tree_remove(struct domain *domain) int ret; struct walk_funcs walkfuncs =3D { .enter =3D domain_tree_remove_sub }; =20 - if (domain->nbentry > 0) { + if (domain->acc[ACC_NODES]) { ret =3D walk_node_tree(domain, NULL, "/", &walkfuncs, domain); if (ret =3D=3D WALK_TREE_ERROR_STOP) syslog(LOG_ERR, @@ -437,7 +437,7 @@ int domain_get_quota(const void *ctx, struct connection= *conn, resp =3D talloc_asprintf_append(resp, "%-16s: %8d\n", #t, e); \ if (!resp) return ENOMEM =20 - ent(nodes, d->nbentry); + ent(nodes, d->acc[ACC_NODES]); ent(watches, d->nbwatch); ent(transactions, ta); ent(outstanding, d->nboutstanding); @@ -1047,8 +1047,27 @@ int domain_adjust_node_perms(struct node *node) return 0; } =20 -static int domain_nbentry_add(struct connection *conn, unsigned int domid, - int add, bool no_dom_alloc) +static int domain_acc_add_valid(struct domain *d, enum accitem what, int a= dd) +{ + assert(what < ARRAY_SIZE(d->acc)); + + if ((add < 0 && -add > d->acc[what]) || + (INT_MAX - d->acc[what]) < add) { + /* + * In a transaction when a node is being added/removed AND the + * same node has been added/removed outside the transaction in + * parallel, the resulting value will be wrong. This is no + * problem, as the transaction will fail due to the resulting + * conflict. + */ + return (add < 0) ? 0 : INT_MAX; + } + + return d->acc[what] + add; +} + +static int domain_acc_add(struct connection *conn, unsigned int domid, + enum accitem what, int add, bool no_dom_alloc) { struct domain *d; struct list_head *head; @@ -1071,56 +1090,49 @@ static int domain_nbentry_add(struct connection *co= nn, unsigned int domid, } } =20 - if (conn && conn->transaction) { + if (conn && conn->transaction && what < ACC_TR_N) { head =3D transaction_get_changed_domains(conn->transaction); - ret =3D acc_add_changed_dom(conn->transaction, head, ACC_NODES, + ret =3D acc_add_changed_dom(conn->transaction, head, what, add, domid); if (errno) { fail_transaction(conn->transaction); return -1; } - /* - * In a transaction when a node is being added/removed AND the - * same node has been added/removed outside the transaction in - * parallel, the resulting number of nodes will be wrong. This - * is no problem, as the transaction will fail due to the - * resulting conflict. - * In the node remove case the resulting number can be even - * negative, which should be avoided. - */ - return max(d->nbentry + ret, 0); + return domain_acc_add_valid(d, what, ret); } =20 - d->nbentry +=3D add; + d->acc[what] =3D domain_acc_add_valid(d, what, add); =20 - return d->nbentry; + return d->acc[what]; } =20 int domain_nbentry_inc(struct connection *conn, unsigned int domid) { - return (domain_nbentry_add(conn, domid, 1, false) < 0) ? errno : 0; + return (domain_acc_add(conn, domid, ACC_NODES, 1, false) < 0) + ? errno : 0; } =20 int domain_nbentry_dec(struct connection *conn, unsigned int domid) { - return (domain_nbentry_add(conn, domid, -1, true) < 0) ? errno : 0; + return (domain_acc_add(conn, domid, ACC_NODES, -1, true) < 0) + ? errno : 0; } =20 int domain_nbentry_fix(unsigned int domid, int num, bool update) { int ret; =20 - ret =3D domain_nbentry_add(NULL, domid, update ? num : 0, update); + ret =3D domain_acc_add(NULL, domid, ACC_NODES, update ? num : 0, update); if (ret < 0 || update) return ret; =20 return domid_is_unprivileged(domid) ? ret + num : 0; } =20 -int domain_nbentry(struct connection *conn) +unsigned int domain_nbentry(struct connection *conn) { return domain_is_unprivileged(conn) - ? domain_nbentry_add(conn, conn->id, 0, true) : 0; + ? domain_acc_add(conn, conn->id, ACC_NODES, 0, true) : 0; } =20 static bool domain_chk_quota(struct domain *domain, int mem) @@ -1597,7 +1609,7 @@ static int domain_check_acc_init_sub(const void *k, v= oid *v, void *arg) * If everything is correct incrementing the value for each node will * result in dom->nodes being 0 at the end. */ - dom->nodes =3D -d->nbentry; + dom->nodes =3D -d->acc[ACC_NODES]; =20 if (!hashtable_insert(domains, &dom->domid, dom)) { talloc_free(dom); @@ -1652,7 +1664,7 @@ static int domain_check_acc_cb(const void *k, void *v= , void *arg) if (!d) return 0; =20 - d->nbentry +=3D dom->nodes; + d->acc[ACC_NODES] +=3D dom->nodes; =20 return 0; } diff --git a/tools/xenstore/xenstored_domain.h b/tools/xenstore/xenstored_d= omain.h index 40803574f6..9d05eb01da 100644 --- a/tools/xenstore/xenstored_domain.h +++ b/tools/xenstore/xenstored_domain.h @@ -27,6 +27,7 @@ enum accitem { ACC_NODES, ACC_TR_N, /* Number of elements per transaction. */ + ACC_N =3D ACC_TR_N, /* Number of elements per domain. */ }; =20 void handle_event(void); @@ -77,7 +78,7 @@ int domain_alloc_permrefs(struct node_perms *perms); int domain_nbentry_inc(struct connection *conn, unsigned int domid); int domain_nbentry_dec(struct connection *conn, unsigned int domid); int domain_nbentry_fix(unsigned int domid, int num, bool update); -int domain_nbentry(struct connection *conn); +unsigned int domain_nbentry(struct connection *conn); int domain_memory_add(unsigned int domid, int mem, bool no_quota_check); =20 /* --=20 2.35.3