From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342710; cv=none; d=zohomail.com; s=zohoarc; b=fSbTioTdTCnv4826Q/DfVG7io73sezOZhlD7wL0He/K6FSj/snqFK0kGCqOZhuiXHVMmwZ4kASgRK7dhNzby8/4KaIUmA9NLa/j0+1cMVxguu9Cq4eKNR/+VUi2Pnqhw+gUqmbIYJF2RB/9ySa6MaO6540nI+fWGpEzwiln9HtU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342710; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=x0Yjo3IpW1vMsmgMTwP6wxC29Ocsm8AaiL9BdPXaULc=; b=eW8d3BuVJs/SKJpgvMTow7hJatMh9nWjmIidnnamuRAYvZzPw/xG9HVKUZrHGysnrEIk1PCam28GqjrE3MifXyVIkhv9xrV2FrIYxMgaa0kOt7bi4ue+64JRikmVxr5GA5CkWfpZ8DiRs4cUWWef6WSDzOD0b3efjzz9f73Qc30= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342710673872.421255814729; Wed, 13 Mar 2024 08:11:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEk-0003fx-Q9; Wed, 13 Mar 2024 11:09:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEY-0003a2-VI; Wed, 13 Mar 2024 11:09:37 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEU-0005ru-Td; Wed, 13 Mar 2024 11:09:34 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 630C860E2B; Wed, 13 Mar 2024 18:09:26 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-RMWiAOWN; Wed, 13 Mar 2024 18:09:25 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342565; bh=x0Yjo3IpW1vMsmgMTwP6wxC29Ocsm8AaiL9BdPXaULc=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=UUjA4evX1wTqskTwqT0ZaXBm9+JMQ7iyYJsemkKnWwSZ6m24yKpcdbktWYkcJKIdm Si5/yOTj4u2ZrZiQ6vK83CfFPx4BByxAUUxQbQfgbWZjwulu56LrPnDJhoKyNQzqVF gMFFmLde5bPICrx3BqQ4PWoY2LZ6V+IUoyKCeZV0= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 01/15] scripts/qapi: support type-based unions Date: Wed, 13 Mar 2024 18:08:53 +0300 Message-Id: <20240313150907.623462-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342713141100003 Content-Type: text/plain; charset="utf-8" Look at block-job-change command: we have to specify both 'id' to chose the job to operate on and 'type' for QAPI union be parsed. But for user this looks redundant: when we specify 'id', QEMU should be able to get corresponding job's type. This commit brings such a possibility: just specify some Enum type as 'discriminator', and define a function somewhere with prototype bool YourUnionType_mapper(YourUnionType *, EnumType *out, Error **errp) Further commits will use this functionality to upgrade block-job-change interface and introduce some new interfaces. Signed-off-by: Vladimir Sementsov-Ogievskiy --- scripts/qapi/introspect.py | 5 +++- scripts/qapi/schema.py | 50 +++++++++++++++++++++++--------------- scripts/qapi/types.py | 3 ++- scripts/qapi/visit.py | 43 ++++++++++++++++++++++++++------ 4 files changed, 73 insertions(+), 28 deletions(-) diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py index 67c7d89aae..04d8d424f5 100644 --- a/scripts/qapi/introspect.py +++ b/scripts/qapi/introspect.py @@ -336,7 +336,10 @@ def visit_object_type_flat(self, name: str, info: Opti= onal[QAPISourceInfo], 'members': [self._gen_object_member(m) for m in members] } if variants: - obj['tag'] =3D variants.tag_member.name + if variants.tag_member: + obj['tag'] =3D variants.tag_member.name + else: + obj['discriminator-type'] =3D variants.tag_type.name obj['variants'] =3D [self._gen_variant(v) for v in variants.va= riants] self._gen_tree(name, 'object', obj, ifcond, features) =20 diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py index 8ba5665bc6..0efe8d815c 100644 --- a/scripts/qapi/schema.py +++ b/scripts/qapi/schema.py @@ -585,16 +585,16 @@ def visit(self, visitor): =20 =20 class QAPISchemaVariants: - def __init__(self, tag_name, info, tag_member, variants): + def __init__(self, discriminator, info, tag_member, variants): # Unions pass tag_name but not tag_member. # Alternates pass tag_member but not tag_name. # After check(), tag_member is always set. - assert bool(tag_member) !=3D bool(tag_name) - assert (isinstance(tag_name, str) or + assert bool(tag_member) !=3D bool(discriminator) + assert (isinstance(discriminator, str) or isinstance(tag_member, QAPISchemaObjectTypeMember)) for v in variants: assert isinstance(v, QAPISchemaVariant) - self._tag_name =3D tag_name + self.discriminator =3D discriminator self.info =3D info self.tag_member =3D tag_member self.variants =3D variants @@ -604,16 +604,24 @@ def set_defined_in(self, name): v.set_defined_in(name) =20 def check(self, schema, seen): - if self._tag_name: # union - self.tag_member =3D seen.get(c_name(self._tag_name)) + self.tag_type =3D None + + if self.discriminator: # assume union with type discriminator + self.tag_type =3D schema.lookup_type(self.discriminator) + + # union with discriminator field + if self.discriminator and not self.tag_type: + tag_name =3D self.discriminator + self.tag_member =3D seen.get(c_name(tag_name)) + self.tag_type =3D self.tag_member.type base =3D "'base'" # Pointing to the base type when not implicit would be # nice, but we don't know it here - if not self.tag_member or self._tag_name !=3D self.tag_member.= name: + if not self.tag_member or tag_name !=3D self.tag_member.name: raise QAPISemError( self.info, "discriminator '%s' is not a member of %s" - % (self._tag_name, base)) + % (tag_name, base)) # Here we do: base_type =3D schema.lookup_type(self.tag_member.defined_in) assert base_type @@ -623,29 +631,33 @@ def check(self, schema, seen): raise QAPISemError( self.info, "discriminator member '%s' of %s must be of enum type" - % (self._tag_name, base)) + % (tag_name, base)) if self.tag_member.optional: raise QAPISemError( self.info, "discriminator member '%s' of %s must not be optional" - % (self._tag_name, base)) + % (tag_name, base)) if self.tag_member.ifcond.is_present(): raise QAPISemError( self.info, "discriminator member '%s' of %s must not be condition= al" - % (self._tag_name, base)) - else: # alternate + % (tag_name, base)) + elif not self.tag_type: # alternate assert isinstance(self.tag_member.type, QAPISchemaEnumType) assert not self.tag_member.optional assert not self.tag_member.ifcond.is_present() - if self._tag_name: # union + + if self.tag_type: # union # branches that are not explicitly covered get an empty type cases =3D {v.name for v in self.variants} - for m in self.tag_member.type.members: + for m in self.tag_type.members: if m.name not in cases: v =3D QAPISchemaVariant(m.name, self.info, 'q_empty', m.ifcond) - v.set_defined_in(self.tag_member.defined_in) + if self.tag_member: + v.set_defined_in(self.tag_member.defined_in) + else: + v.set_defined_in(self.tag_type.name) self.variants.append(v) if not self.variants: raise QAPISemError(self.info, "union has no branches") @@ -654,11 +666,11 @@ def check(self, schema, seen): # Union names must match enum values; alternate names are # checked separately. Use 'seen' to tell the two apart. if seen: - if v.name not in self.tag_member.type.member_names(): + if v.name not in self.tag_type.member_names(): raise QAPISemError( self.info, "branch '%s' is not a value of %s" - % (v.name, self.tag_member.type.describe())) + % (v.name, self.tag_type.describe())) if not isinstance(v.type, QAPISchemaObjectType): raise QAPISemError( self.info, @@ -1116,7 +1128,7 @@ def _make_variant(self, case, typ, ifcond, info): def _def_union_type(self, expr: QAPIExpression): name =3D expr['union'] base =3D expr['base'] - tag_name =3D expr['discriminator'] + discriminator =3D expr['discriminator'] data =3D expr['data'] assert isinstance(data, dict) info =3D expr.info @@ -1136,7 +1148,7 @@ def _def_union_type(self, expr: QAPIExpression): QAPISchemaObjectType(name, info, expr.doc, ifcond, features, base, members, QAPISchemaVariants( - tag_name, info, None, variants))) + discriminator, info, None, variants))) =20 def _def_alternate_type(self, expr: QAPIExpression): name =3D expr['alternate'] diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py index c39d054d2c..13021e3f82 100644 --- a/scripts/qapi/types.py +++ b/scripts/qapi/types.py @@ -230,7 +230,8 @@ def gen_variants(variants: QAPISchemaVariants) -> str: ret =3D mcgen(''' union { /* union tag is @%(c_name)s */ ''', - c_name=3Dc_name(variants.tag_member.name)) + c_name=3Dc_name(variants.tag_member.name if variants.tag_m= ember + else variants.tag_type.name)) =20 for var in variants.variants: if var.type.name =3D=3D 'q_empty': diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index c56ea4d724..fbe7ae071d 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -60,6 +60,13 @@ def gen_visit_members_decl(name: str) -> str: c_name=3Dc_name(name)) =20 =20 +def gen_visit_members_tag_mapper_decl(name: str, tag_type: str) -> str: + return mcgen(''' + +bool %(c_name)s_mapper(%(c_name)s *obj, %(tag_type)s *tag, Error **errp); + ''', c_name=3Dc_name(name), tag_type=3Dc_name(tag_type)) + + def gen_visit_object_members(name: str, base: Optional[QAPISchemaObjectType], members: List[QAPISchemaObjectTypeMember], @@ -83,6 +90,12 @@ def gen_visit_object_members(name: str, ret +=3D memb.ifcond.gen_endif() ret +=3D sep =20 + if variants: + ret +=3D mcgen(''' + %(c_name)s tag; +''', + c_name=3Dc_name(variants.tag_type.name)) + if base: ret +=3D mcgen(''' if (!visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, errp)) { @@ -132,17 +145,29 @@ def gen_visit_object_members(name: str, ret +=3D memb.ifcond.gen_endif() =20 if variants: - tag_member =3D variants.tag_member - assert isinstance(tag_member.type, QAPISchemaEnumType) + tag_type =3D variants.tag_type + assert isinstance(tag_type, QAPISchemaEnumType) =20 - ret +=3D mcgen(''' - switch (obj->%(c_name)s) { + if variants.tag_member: + ret +=3D mcgen(''' + tag =3D obj->%(c_name)s; ''', - c_name=3Dc_name(tag_member.name)) + c_name=3Dc_name(variants.tag_member.name)) + else: + ret +=3D mcgen(''' + if (!%(c_name)s_mapper(obj, &tag, errp)) { + return false; + } +''', + c_name=3Dc_name(name)) + + ret +=3D mcgen(''' + switch (tag) { +''') =20 for var in variants.variants: - case_str =3D c_enum_const(tag_member.type.name, var.name, - tag_member.type.prefix) + case_str =3D c_enum_const(tag_type.name, var.name, + tag_type.prefix) ret +=3D var.ifcond.gen_if() if var.type.name =3D=3D 'q_empty': # valid variant and nothing to do @@ -400,6 +425,10 @@ def visit_object_type(self, return with ifcontext(ifcond, self._genh, self._genc): self._genh.add(gen_visit_members_decl(name)) + if variants and variants.tag_type: + self._genh.add( + gen_visit_members_tag_mapper_decl(name, + variants.tag_type.na= me)) self._genc.add(gen_visit_object_members(name, base, members, variants)) # TODO Worth changing the visitor signature, so we could --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342662; cv=none; d=zohomail.com; s=zohoarc; b=fq1cBFfhfuZIISYpQzPLTh88x+fUOSKV7hxfkJkZR5iBrys103dAoCe20xi665Q3N8Ibd/sznaN0S4C1Pjvtl6B5dCUquySXbDeM7XuAgJytRrK2OH7JWLF/V6ufgRYCIXMnA9lyHYIWArNEhjXhs1uJM5PRzeAWcU10Zhz2Sus= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342662; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cLF4sNqFIfGUD8kpAtx4cz6Ol33QAQAavlhJwLdPbio=; b=jGzPcqJ2YF+SnqI3EnTugF+F/KYSMjEN+PNnICf3KUVD/4G6zjENA978cZv4ZwBnvjDad0fg2wf49vBRc/7Hfb6J+MbywlEICRDPH5uQXoJLqJ+gZ0CbTQ2YwAkmntYV76cQjAT5sJMvnADanc121QuelCOQ9f6ohimz0nZfZG0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342662458662.632250748493; Wed, 13 Mar 2024 08:11:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEq-0003qu-Ku; Wed, 13 Mar 2024 11:09:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEY-0003a0-Iy; Wed, 13 Mar 2024 11:09:35 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEV-0005rz-0c; Wed, 13 Mar 2024 11:09:34 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 41B2760E1B; Wed, 13 Mar 2024 18:09:27 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-BYtVbgjh; Wed, 13 Mar 2024 18:09:26 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342566; bh=cLF4sNqFIfGUD8kpAtx4cz6Ol33QAQAavlhJwLdPbio=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=aJafLsFCqrLkLfmhlsZPLOT8+/fSFiPwWstCRq7IV0aJshqg0LWtkJizhQr8YkmsP wqw1oHw6TEebHN2e25Ignobk0TvrPgil23L2UGTf6wvGKd97GczzQhMYFR35Oz2xAQ ig6v4+0k9tdektB7QUu9KekxHYFeQ+xjT4D+56LY= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 02/15] qapi: rename BlockJobChangeOptions to JobChangeOptions Date: Wed, 13 Mar 2024 18:08:54 +0300 Message-Id: <20240313150907.623462-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342670162100001 Content-Type: text/plain; charset="utf-8" We are going to move change action from block-job to job implementation, and then move to job-* extenral APIs, deprecating block-job-* APIs. This commit simplifies further transition. The commit is made by command git grep -l BlockJobChangeOptions | \ xargs sed -i 's/BlockJobChangeOptions/JobChangeOptions/g' Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/mirror.c | 4 ++-- blockdev.c | 2 +- blockjob.c | 2 +- include/block/blockjob.h | 2 +- include/block/blockjob_int.h | 2 +- qapi/block-core.json | 12 ++++++------ 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 5145eb53e1..a177502e4f 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1251,11 +1251,11 @@ static bool commit_active_cancel(Job *job, bool for= ce) return force || !job_is_ready(job); } =20 -static void mirror_change(BlockJob *job, BlockJobChangeOptions *opts, +static void mirror_change(BlockJob *job, JobChangeOptions *opts, Error **errp) { MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common); - BlockJobChangeOptionsMirror *change_opts =3D &opts->u.mirror; + JobChangeOptionsMirror *change_opts =3D &opts->u.mirror; MirrorCopyMode current; =20 /* diff --git a/blockdev.c b/blockdev.c index d8fb3399f5..7881f6e5a6 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3245,7 +3245,7 @@ void qmp_block_job_dismiss(const char *id, Error **er= rp) job_dismiss_locked(&job, errp); } =20 -void qmp_block_job_change(BlockJobChangeOptions *opts, Error **errp) +void qmp_block_job_change(JobChangeOptions *opts, Error **errp) { BlockJob *job; =20 diff --git a/blockjob.c b/blockjob.c index d5f29e14af..8cfbb15543 100644 --- a/blockjob.c +++ b/blockjob.c @@ -312,7 +312,7 @@ static bool block_job_set_speed(BlockJob *job, int64_t = speed, Error **errp) return block_job_set_speed_locked(job, speed, errp); } =20 -void block_job_change_locked(BlockJob *job, BlockJobChangeOptions *opts, +void block_job_change_locked(BlockJob *job, JobChangeOptions *opts, Error **errp) { const BlockJobDriver *drv =3D block_job_driver(job); diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 7061ab7201..5dd1b08909 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -181,7 +181,7 @@ bool block_job_set_speed_locked(BlockJob *job, int64_t = speed, Error **errp); * * Change the job according to opts. */ -void block_job_change_locked(BlockJob *job, BlockJobChangeOptions *opts, +void block_job_change_locked(BlockJob *job, JobChangeOptions *opts, Error **errp); =20 /** diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index 4c3d2e25a2..d9c3b911d0 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -73,7 +73,7 @@ struct BlockJobDriver { * * Note that this can already be called before the job coroutine is ru= nning. */ - void (*change)(BlockJob *job, BlockJobChangeOptions *opts, Error **err= p); + void (*change)(BlockJob *job, JobChangeOptions *opts, Error **errp); =20 /* * Query information specific to this kind of block job. diff --git a/qapi/block-core.json b/qapi/block-core.json index 1874f880a8..67dd0ef038 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3063,18 +3063,18 @@ 'allow-preconfig': true } =20 ## -# @BlockJobChangeOptionsMirror: +# @JobChangeOptionsMirror: # # @copy-mode: Switch to this copy mode. Currently, only the switch # from 'background' to 'write-blocking' is implemented. # # Since: 8.2 ## -{ 'struct': 'BlockJobChangeOptionsMirror', +{ 'struct': 'JobChangeOptionsMirror', 'data': { 'copy-mode' : 'MirrorCopyMode' } } =20 ## -# @BlockJobChangeOptions: +# @JobChangeOptions: # # Block job options that can be changed after job creation. # @@ -3084,10 +3084,10 @@ # # Since: 8.2 ## -{ 'union': 'BlockJobChangeOptions', +{ 'union': 'JobChangeOptions', 'base': { 'id': 'str', 'type': 'JobType' }, 'discriminator': 'type', - 'data': { 'mirror': 'BlockJobChangeOptionsMirror' } } + 'data': { 'mirror': 'JobChangeOptionsMirror' } } =20 ## # @block-job-change: @@ -3097,7 +3097,7 @@ # Since: 8.2 ## { 'command': 'block-job-change', - 'data': 'BlockJobChangeOptions', 'boxed': true } + 'data': 'JobChangeOptions', 'boxed': true } =20 ## # @BlockdevDiscardOptions: --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342736; cv=none; d=zohomail.com; s=zohoarc; b=nvdlOjk1V5GHkRO8uXbCBPdgNlnlSQ3yTAFNd0KgQIbnwCbAiSGGZFgle5/seQDX27JnWzl9A9n9lrLqdxDIhfWZ8qZtMRCmKWd/C7o2EQSMJyhN35V+a86voJxHzkdg6KoKMC1F1r/sRqroqkzxrKFcDWFdDnWGPuIHfSNEJ5c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342736; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yLJaDyEAelrXRgY1Ri4RSUibfQW2G7z/Oefqj6dQnvE=; b=dc27c2hv/iaLNAiRLaY3haVCjLgQb7HFYIUztaqANOKm47R5BTwux0Cwa3rdQUdKCalm0GZb4kzQZLAmiDl+MLHLP2MD4vkX/4IWK8uwsvp1J6IRG4+OoYYWwm/+VZOmeAKIlSe4Hgs8t/Ww8YZuIqvz1SVtYCtTTNoyWZWAaIc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342736362526.2988057274109; Wed, 13 Mar 2024 08:12:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEk-0003fY-68; Wed, 13 Mar 2024 11:09:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEW-0003Zk-Uc; Wed, 13 Mar 2024 11:09:33 -0400 Received: from forwardcorp1c.mail.yandex.net ([2a02:6b8:c03:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEU-0005s8-Tm; Wed, 13 Mar 2024 11:09:32 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 35B2160D96; Wed, 13 Mar 2024 18:09:28 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-2fUmio67; Wed, 13 Mar 2024 18:09:27 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342567; bh=yLJaDyEAelrXRgY1Ri4RSUibfQW2G7z/Oefqj6dQnvE=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=kXoH2gLKghNwvWq45ERhPV17k26UJ/WIjhI1ccL/s4oUPdw10Ywq7jatYgn3duIOY Ao8k9TLrpA7+yaOAs4zxKydugDF2wkPqC1/NP/xdh5kVYpkPwtCCIgOHSCTwDeGlSv ipCpNdEE0wcqIbtabImHIYt+pmkEZxf2lJD/fGTM= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 03/15] blockjob: block_job_change_locked(): check job type Date: Wed, 13 Mar 2024 18:08:55 +0300 Message-Id: <20240313150907.623462-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c03:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342737379100001 Content-Type: text/plain; charset="utf-8" User may specify wrong type for the job id. Let's check it. Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockjob.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blockjob.c b/blockjob.c index 8cfbb15543..788cb1e07d 100644 --- a/blockjob.c +++ b/blockjob.c @@ -319,6 +319,12 @@ void block_job_change_locked(BlockJob *job, JobChangeO= ptions *opts, =20 GLOBAL_STATE_CODE(); =20 + if (job_type(&job->job) !=3D opts->type) { + error_setg(errp, "Job '%s' is '%s' job, not '%s'", job->job.id, + job_type_str(&job->job), JobType_str(opts->type)); + return; + } + if (job_apply_verb_locked(&job->job, JOB_VERB_CHANGE, errp)) { return; } --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342659; cv=none; d=zohomail.com; s=zohoarc; b=eEkEeQzE9C0IKnEwIpPOY8wGslTc/mSuwJy2NRrvTi6VuIVokyTWAdz9N8flb50OOBKO8k8NygRfu0gHPbCiKAa+7UAVPpRIgg+DnhlmUYkHsSJmKFaoQepdjjZUfplzK92NPEs1WxJZadEg7NFfkpPZaa3dEMWI7gfaRw8mXGc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342659; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=5ZvJ46KgdVpnV5C4Q/6UM2kcQMZH+kF/RNKW8X+vZEk=; b=Klf9hXOdqN43BPfXB3mJZhp9yIKl+0pwMgM8cV5aIMmNwwcr4jPIZDYZTxeVVVMmJhKNrslln4dRbo4L3V+YoljTAGUsg95CzrB2MznQmkkDWUAcku879op1mzu74MRx9BpTlAl9CUsJmnvWHDgmDerN9NPK8W5BgZGsW1L5Xwk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342659446266.7122009056591; Wed, 13 Mar 2024 08:10:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEv-0003x8-3k; Wed, 13 Mar 2024 11:09:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEY-0003Zz-Cf; Wed, 13 Mar 2024 11:09:35 -0400 Received: from forwardcorp1c.mail.yandex.net ([2a02:6b8:c03:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEV-0005sM-1a; Wed, 13 Mar 2024 11:09:34 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 318D160D9A; Wed, 13 Mar 2024 18:09:29 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-YxMB9SvB; Wed, 13 Mar 2024 18:09:28 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342568; bh=5ZvJ46KgdVpnV5C4Q/6UM2kcQMZH+kF/RNKW8X+vZEk=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=IJ9rSzFJ3O5UmlSuvX/2XV+NyVLBQWZ0WVWtANn2NncM+/pGFHiIiCjdvgM2V3H0U pQSGZLrou+DJ9bgDfa3DAvc1P3ZTXdja6TcBobYepa2kUOX5dretj0p5Y7s2aPFkWr D7lP8biyVMwnmiEmmLLv35X8g7OzTX3Adr5Kbwrs= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 04/15] qapi: block-job-change: make copy-mode parameter optional Date: Wed, 13 Mar 2024 18:08:56 +0300 Message-Id: <20240313150907.623462-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c03:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342667828100001 Content-Type: text/plain; charset="utf-8" We are going to add more parameters to change. We want to make possible to change only one or any subset of available options. So all the options should be optional. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/mirror.c | 5 +++++ qapi/block-core.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/block/mirror.c b/block/mirror.c index a177502e4f..2d0cd22c06 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1265,6 +1265,11 @@ static void mirror_change(BlockJob *job, JobChangeOp= tions *opts, =20 GLOBAL_STATE_CODE(); =20 + if (!change_opts->has_copy_mode) { + /* Nothing to do */ + return; + } + if (qatomic_read(&s->copy_mode) =3D=3D change_opts->copy_mode) { return; } diff --git a/qapi/block-core.json b/qapi/block-core.json index 67dd0ef038..6041e7bd8f 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3071,7 +3071,7 @@ # Since: 8.2 ## { 'struct': 'JobChangeOptionsMirror', - 'data': { 'copy-mode' : 'MirrorCopyMode' } } + 'data': { '*copy-mode' : 'MirrorCopyMode' } } =20 ## # @JobChangeOptions: --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342860; cv=none; d=zohomail.com; s=zohoarc; b=HTMqzqEb9JZGlSx96lI5hX8t5W+pUKlYb6N1LRagACvUSbHXECuYkJ4AtcPnkd9chQZM91rsL1GabnjvTMVBdnyTkUSTb04am3T5dMGrLezVwnYZUiYvrCfjwg3vUxDDy65vixVAv9ckhzRrDmgOP4rW3w+2CXPC533m9s2OZRM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342860; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=z/o77ZBizUBxnCNHSRVifBjl5Rg0JJeqoaiwZHtzozY=; b=eb3cfFWndl2hNPPu1Hs+u8A09NKAurFH8lYGnlIrz9BeEKy+uuXU49xuLhxRoggKGIStTv6L/hB/oq/XNxx6mwF/iLNG70LQzAQyZhe4VVuIFToeDjhAarR4Vz4c3/8Jj7tvGgG+j41FaksPdS+QbnjQFw+sDXy+YZ44wiJehoo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17103428602831013.4278479796716; Wed, 13 Mar 2024 08:14:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEr-0003ts-Ko; Wed, 13 Mar 2024 11:09:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEd-0003bZ-G8; Wed, 13 Mar 2024 11:09:40 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEV-0005se-O3; Wed, 13 Mar 2024 11:09:39 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 3016D60E56; Wed, 13 Mar 2024 18:09:30 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-6Cfukku8; Wed, 13 Mar 2024 18:09:29 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342569; bh=z/o77ZBizUBxnCNHSRVifBjl5Rg0JJeqoaiwZHtzozY=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=zBH2HsiKUheV56XqzUCYE/3gnZw506OzWaONG4JJhyRKvXSs6x622Ew2KB/kt8Mpe fDHa3neIJmlt2ViIfG2l850PNabShldyOWOobOpRurtZSzxqdkKvMHLtJGNn/LRZE+ kkvJyUaiiydLWleU5vc5TgrjtfxK5R9XZPmZDBAg= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 05/15] qapi: JobChangeOptions: make type member optional and deprecated Date: Wed, 13 Mar 2024 18:08:57 +0300 Message-Id: <20240313150907.623462-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342861805100001 Content-Type: text/plain; charset="utf-8" Now QEMU can understand type directly from the job itself, type is redundant. Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockjob.c | 2 +- docs/about/deprecated.rst | 6 ++++++ job-qmp.c | 17 +++++++++++++++++ qapi/block-core.json | 10 ++++++++-- stubs/meson.build | 1 + stubs/qapi-jobchangeoptions-mapper.c | 8 ++++++++ 6 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 stubs/qapi-jobchangeoptions-mapper.c diff --git a/blockjob.c b/blockjob.c index 788cb1e07d..33c40e7d25 100644 --- a/blockjob.c +++ b/blockjob.c @@ -319,7 +319,7 @@ void block_job_change_locked(BlockJob *job, JobChangeOp= tions *opts, =20 GLOBAL_STATE_CODE(); =20 - if (job_type(&job->job) !=3D opts->type) { + if (opts->has_type && job_type(&job->job) !=3D opts->type) { error_setg(errp, "Job '%s' is '%s' job, not '%s'", job->job.id, job_type_str(&job->job), JobType_str(opts->type)); return; diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index dfd681cd02..64981e5e4a 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -142,6 +142,12 @@ accepted incorrect commands will return an error. User= s should make sure that all arguments passed to ``device_add`` are consistent with the documented property types. =20 + +``block-job-change`` argument ``type`` (since 9.1) +'''''''''''''''''''''''''''''''''''''''''''''''''' + +QEMU can get job type from the job itself (by @id), @type field is redunda= nt. + QEMU Machine Protocol (QMP) events ---------------------------------- =20 diff --git a/job-qmp.c b/job-qmp.c index 9e26fa899f..c486df9579 100644 --- a/job-qmp.c +++ b/job-qmp.c @@ -26,6 +26,8 @@ #include "qemu/osdep.h" #include "qemu/job.h" #include "qapi/qapi-commands-job.h" +#include "qapi/qapi-types-block-core.h" +#include "qapi/qapi-visit-block-core.h" #include "qapi/error.h" #include "trace/trace-root.h" =20 @@ -186,3 +188,18 @@ JobInfoList *qmp_query_jobs(Error **errp) =20 return head; } + +bool JobChangeOptions_mapper(JobChangeOptions *opts, JobType *out, Error *= *errp) +{ + Job *job; + + JOB_LOCK_GUARD(); + + job =3D find_job_locked(opts->id, errp); + if (!job) { + return false; + } + + *out =3D job_type(job); + return true; +} diff --git a/qapi/block-core.json b/qapi/block-core.json index 6041e7bd8f..3d890dfcd0 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3082,11 +3082,17 @@ # # @type: The job type # +# Features: +# +# @deprecated: Members @type is deprecated. Qemu can get type from +# the job itself, @type is redundant. +# # Since: 8.2 ## { 'union': 'JobChangeOptions', - 'base': { 'id': 'str', 'type': 'JobType' }, - 'discriminator': 'type', + 'base': { 'id': 'str', + '*type': { 'type': 'JobType', 'features': ['deprecated'] } }, + 'discriminator': 'JobType', 'data': { 'mirror': 'JobChangeOptionsMirror' } } =20 ## diff --git a/stubs/meson.build b/stubs/meson.build index 0bf25e6ca5..e480400a6c 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -31,6 +31,7 @@ stub_ss.add(files('module-opts.c')) stub_ss.add(files('monitor.c')) stub_ss.add(files('monitor-core.c')) stub_ss.add(files('physmem.c')) +stub_ss.add(files('qapi-jobchangeoptions-mapper.c')) stub_ss.add(files('qemu-timer-notify-cb.c')) stub_ss.add(files('memory_device.c')) stub_ss.add(files('qmp-command-available.c')) diff --git a/stubs/qapi-jobchangeoptions-mapper.c b/stubs/qapi-jobchangeopt= ions-mapper.c new file mode 100644 index 0000000000..e4acfd91b3 --- /dev/null +++ b/stubs/qapi-jobchangeoptions-mapper.c @@ -0,0 +1,8 @@ +#include "qemu/osdep.h" +#include "qapi/qapi-visit-block-core.h" +#include "qapi/qapi-types-job.h" + +bool JobChangeOptions_mapper(JobChangeOptions *opts, JobType *out, Error *= *errp) +{ + g_assert_not_reached(); +} --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342752; cv=none; d=zohomail.com; s=zohoarc; b=drDm5U2tXU5voJhIY6Ktv5NchnYcCtT1kds7kYXDz7f7c5gIhEiGv/q1FM12HDLu564COcrz/N0gM3WRPqBx0aQULY2IhFwRkSM8zydBgZurq6VP+OiaDPyvr+YE5Y8/1Iew4EzsPz/gQLN6T95J8rgJhceRWMUMEtdrp4udnik= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342752; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cEJJa7Y2kfX6gm4lD1BYvT1prEfuPN4uHYFH/69RoYA=; b=PiHlfwZLAEong0P37z1K73wKhOY6Y9DImS38znVY5lWM8IaUCg/6ngOvODMC/iXtkJYYOPGzt8AljZ/sJozY1NP2NUGyqo1o2q5w/D/2Wb1IJT7dFiWJUKRNHNbcdLN7TK7mIf81MtwU/7nLg23+AVklHFn07dj+R16jUZC72Zw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342752870193.7269588238969; Wed, 13 Mar 2024 08:12:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEp-0003pC-Gx; Wed, 13 Mar 2024 11:09:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEa-0003aD-3F; Wed, 13 Mar 2024 11:09:37 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEY-0005t4-1i; Wed, 13 Mar 2024 11:09:35 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 4DE6660E2C; Wed, 13 Mar 2024 18:09:31 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-CsQfF6Nt; Wed, 13 Mar 2024 18:09:30 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342570; bh=cEJJa7Y2kfX6gm4lD1BYvT1prEfuPN4uHYFH/69RoYA=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=U6bFoIfb3rFVeI1IkmXS9LfHkDm6syRb2JhVYeZplZkiBZUgYDwLt303xjDOBYFhG 5GuRNJi6CHoGR3O9FUtXp8aTuD2DckmtLDXYhXo71YDzKc08t5baFSe2jxDok5UY70 k5Q+1akh2xOfrZi515864g5pimqfiszPdqiFJnv8= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 06/15] blockjob: move change action implementation to job from block-job Date: Wed, 13 Mar 2024 18:08:58 +0300 Message-Id: <20240313150907.623462-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342757459100001 Content-Type: text/plain; charset="utf-8" Like for other block-job-* APIs we want have the actual functionality in job layer and make block-job-change to be a deprecated duplication of job-change in the following commit. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/mirror.c | 7 +++---- blockdev.c | 2 +- blockjob.c | 26 -------------------------- include/block/blockjob.h | 11 ----------- include/block/blockjob_int.h | 7 ------- include/qemu/job.h | 12 ++++++++++++ job-qmp.c | 1 + job.c | 23 +++++++++++++++++++++++ 8 files changed, 40 insertions(+), 49 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 2d0cd22c06..e670d0dd4f 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1251,10 +1251,9 @@ static bool commit_active_cancel(Job *job, bool forc= e) return force || !job_is_ready(job); } =20 -static void mirror_change(BlockJob *job, JobChangeOptions *opts, - Error **errp) +static void mirror_change(Job *job, JobChangeOptions *opts, Error **errp) { - MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common); + MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common.job); JobChangeOptionsMirror *change_opts =3D &opts->u.mirror; MirrorCopyMode current; =20 @@ -1310,9 +1309,9 @@ static const BlockJobDriver mirror_job_driver =3D { .pause =3D mirror_pause, .complete =3D mirror_complete, .cancel =3D mirror_cancel, + .change =3D mirror_change, }, .drained_poll =3D mirror_drained_poll, - .change =3D mirror_change, .query =3D mirror_query, }; =20 diff --git a/blockdev.c b/blockdev.c index 7881f6e5a6..7e13213040 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3256,7 +3256,7 @@ void qmp_block_job_change(JobChangeOptions *opts, Err= or **errp) return; } =20 - block_job_change_locked(job, opts, errp); + job_change_locked(&job->job, opts, errp); } =20 void qmp_change_backing_file(const char *device, diff --git a/blockjob.c b/blockjob.c index 33c40e7d25..2769722b37 100644 --- a/blockjob.c +++ b/blockjob.c @@ -312,32 +312,6 @@ static bool block_job_set_speed(BlockJob *job, int64_t= speed, Error **errp) return block_job_set_speed_locked(job, speed, errp); } =20 -void block_job_change_locked(BlockJob *job, JobChangeOptions *opts, - Error **errp) -{ - const BlockJobDriver *drv =3D block_job_driver(job); - - GLOBAL_STATE_CODE(); - - if (opts->has_type && job_type(&job->job) !=3D opts->type) { - error_setg(errp, "Job '%s' is '%s' job, not '%s'", job->job.id, - job_type_str(&job->job), JobType_str(opts->type)); - return; - } - - if (job_apply_verb_locked(&job->job, JOB_VERB_CHANGE, errp)) { - return; - } - - if (drv->change) { - job_unlock(); - drv->change(job, opts, errp); - job_lock(); - } else { - error_setg(errp, "Job type does not support change"); - } -} - void block_job_ratelimit_processed_bytes(BlockJob *job, uint64_t n) { IO_CODE(); diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 5dd1b08909..72e849a140 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -173,17 +173,6 @@ bool block_job_has_bdrv(BlockJob *job, BlockDriverStat= e *bs); */ bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp= ); =20 -/** - * block_job_change_locked: - * @job: The job to change. - * @opts: The new options. - * @errp: Error object. - * - * Change the job according to opts. - */ -void block_job_change_locked(BlockJob *job, JobChangeOptions *opts, - Error **errp); - /** * block_job_query_locked: * @job: The job to get information about. diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index d9c3b911d0..58bc7a5cea 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -68,13 +68,6 @@ struct BlockJobDriver { =20 void (*set_speed)(BlockJob *job, int64_t speed); =20 - /* - * Change the @job's options according to @opts. - * - * Note that this can already be called before the job coroutine is ru= nning. - */ - void (*change)(BlockJob *job, JobChangeOptions *opts, Error **errp); - /* * Query information specific to this kind of block job. */ diff --git a/include/qemu/job.h b/include/qemu/job.h index 9ea98b5927..d44cdb0cc8 100644 --- a/include/qemu/job.h +++ b/include/qemu/job.h @@ -27,6 +27,7 @@ #define JOB_H =20 #include "qapi/qapi-types-job.h" +#include "qapi/qapi-types-block-core.h" #include "qemu/queue.h" #include "qemu/progress_meter.h" #include "qemu/coroutine.h" @@ -307,6 +308,12 @@ struct JobDriver { */ bool (*cancel)(Job *job, bool force); =20 + /** + * Change the @job's options according to @opts. + * + * Note that this can already be called before the job coroutine is ru= nning. + */ + void (*change)(Job *job, JobChangeOptions *opts, Error **errp); =20 /** * Called when the job is freed. @@ -705,6 +712,11 @@ void job_finalize_locked(Job *job, Error **errp); */ void job_dismiss_locked(Job **job, Error **errp); =20 +/** + * Change the job according to opts. + */ +void job_change_locked(Job *job, JobChangeOptions *opts, Error **errp); + /** * Synchronously finishes the given @job. If @finish is given, it is calle= d to * trigger completion or cancellation of the job. diff --git a/job-qmp.c b/job-qmp.c index c486df9579..abe9b59487 100644 --- a/job-qmp.c +++ b/job-qmp.c @@ -28,6 +28,7 @@ #include "qapi/qapi-commands-job.h" #include "qapi/qapi-types-block-core.h" #include "qapi/qapi-visit-block-core.h" +#include "qapi/qapi-commands-block-core.h" #include "qapi/error.h" #include "trace/trace-root.h" =20 diff --git a/job.c b/job.c index 660ce22c56..69630852dc 100644 --- a/job.c +++ b/job.c @@ -1262,3 +1262,26 @@ int job_finish_sync_locked(Job *job, job_unref_locked(job); return ret; } + +void job_change_locked(Job *job, JobChangeOptions *opts, Error **errp) +{ + GLOBAL_STATE_CODE(); + + if (opts->has_type && job_type(job) !=3D opts->type) { + error_setg(errp, "Job '%s' is '%s' job, not '%s'", job->id, + job_type_str(job), JobType_str(opts->type)); + return; + } + + if (job_apply_verb_locked(job, JOB_VERB_CHANGE, errp)) { + return; + } + + if (job->driver->change) { + job_unlock(); + job->driver->change(job, opts, errp); + job_lock(); + } else { + error_setg(errp, "Job type does not support change"); + } +} --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342821; cv=none; d=zohomail.com; s=zohoarc; b=CPxuSE2IU6bvreJgN7guv2CEyLxmO/y4xryaF0Mrr4t2mR1NQ7VgzqyJkpvdR9GQgP6xElg40VAOy0+HLL3w0xNmv4XtZKO4qcR8PvZV+8njnBIW4CHSraTPUbFIwrQxWXLHcp+GeLqoYASFobuUqyM1aIVk8gjw4ScPleoy1aQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342821; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=16JngrqjP5XAtrooYiWvEZEPUpXmd7+20izMNFPD9Ag=; b=TMhlS54w7KRnFAC4ecwbveGUEdQE83OfnV1S1Os20eSFerLsSzrRUVffbt4tterGVzsBFiHCv0PUQ1NodgeyTvaZEiqGGtp7/FmIH3WEifKlcJriC1DBn/R0tXJAzvt86xtcAOBELg3VFYjfz2PY+SWoUs2pkAhSlVJGK9OoB8A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342821708150.38794331903182; Wed, 13 Mar 2024 08:13:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEo-0003m4-47; Wed, 13 Mar 2024 11:09:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEa-0003aF-Kp; Wed, 13 Mar 2024 11:09:37 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEY-0005tH-UA; Wed, 13 Mar 2024 11:09:36 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 3D55C60E5E; Wed, 13 Mar 2024 18:09:32 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-V6VFz6Zt; Wed, 13 Mar 2024 18:09:31 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342571; bh=16JngrqjP5XAtrooYiWvEZEPUpXmd7+20izMNFPD9Ag=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=XB1SBurYH07eZZOo/h3uIgUN5sIwBLt7qQQFrAn6mfAMsqaAdki2KbOZDNXtduKQp R2n+4bSjIxWJmgXeZNRB1XXCD4rXG3FI/gX37LfrtfpNGoOcKMNEfeqNbtKhIY2h8s BwxkMzs8tAN2kDKiGGUjI+wCMuGjgfjMzrSHSR3g= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 07/15] qapi: add job-change Date: Wed, 13 Mar 2024 18:08:59 +0300 Message-Id: <20240313150907.623462-8-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342823621100005 Content-Type: text/plain; charset="utf-8" Add a new-style command job-change, doing same thing as block-job-change. The aim is finally deprecate block-job-* APIs and move to job-* APIs. We add a new command to qapi/block-core.json, not to qapi/job.json to avoid resolving json file including loops for now. This all would be a lot simple to refactor when we finally drop deprecated block-job-* APIs. @type argument of the new command immediately becomes deprecated. Signed-off-by: Vladimir Sementsov-Ogievskiy --- docs/about/deprecated.rst | 4 ++-- job-qmp.c | 14 ++++++++++++++ qapi/block-core.json | 10 ++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index 64981e5e4a..5ff98ef95f 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -143,8 +143,8 @@ all arguments passed to ``device_add`` are consistent w= ith the documented property types. =20 =20 -``block-job-change`` argument ``type`` (since 9.1) -'''''''''''''''''''''''''''''''''''''''''''''''''' +``block-job-change`` and ``job-change`` argument ``type`` (since 9.1) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' =20 QEMU can get job type from the job itself (by @id), @type field is redunda= nt. =20 diff --git a/job-qmp.c b/job-qmp.c index abe9b59487..011a8736ea 100644 --- a/job-qmp.c +++ b/job-qmp.c @@ -141,6 +141,20 @@ void qmp_job_dismiss(const char *id, Error **errp) job_dismiss_locked(&job, errp); } =20 +void qmp_job_change(JobChangeOptions *opts, Error **errp) +{ + Job *job; + + JOB_LOCK_GUARD(); + job =3D find_job_locked(opts->id, errp); + + if (!job) { + return; + } + + job_change_locked(job, opts, errp); +} + /* Called with job_mutex held. */ static JobInfo *job_query_single_locked(Job *job, Error **errp) { diff --git a/qapi/block-core.json b/qapi/block-core.json index 3d890dfcd0..f5cefa441b 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3105,6 +3105,16 @@ { 'command': 'block-job-change', 'data': 'JobChangeOptions', 'boxed': true } =20 +## +# @job-change: +# +# Change the block job's options. +# +# Since: 9.1 +## +{ 'command': 'job-change', + 'data': 'JobChangeOptions', 'boxed': true } + ## # @BlockdevDiscardOptions: # --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342821; cv=none; d=zohomail.com; s=zohoarc; b=WuQ1AjJ5PH6uLHZ5l0lQMfOBItaVU1pLRUpH8FNVnfjtrCHjbRpByKxlJjLPuFJoAURPyl3N0koob8A0rU4jnLBz+Za+iK9ixMIhXfMCObwbC4B25f+RZJXPI36tiAAzuSP8X0hPsKTa/HsYVB3Jae791U+r0R9tZd7N2sxZGdI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342821; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=oAmIBIVRoPB9IV/Df1MWhYDzUX/APDm0FauUKs5ntZ8=; b=OH9Q0rcCFsnccWlUFdyqniLmZIBlAN5P+DPrlOXplN8PED9nFrEP6Yr1V2R/U5wc5x1SnGJ4aTCS9QwkSk0oAVJ5CGN+fFZo7SqjA9PBlAGDNDwabOmXFFKawbg1RWVOgjM2kifamNjT0iNrtc1NFgFgYcRDL3PB/ksdvF3gwfs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342821795164.13831180231273; Wed, 13 Mar 2024 08:13:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEs-0003uo-7W; Wed, 13 Mar 2024 11:09:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEb-0003bC-Jy; Wed, 13 Mar 2024 11:09:39 -0400 Received: from forwardcorp1c.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEZ-0005td-G5; Wed, 13 Mar 2024 11:09:37 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 5E81960DBA; Wed, 13 Mar 2024 18:09:33 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-Jw55lBFV; Wed, 13 Mar 2024 18:09:32 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342572; bh=oAmIBIVRoPB9IV/Df1MWhYDzUX/APDm0FauUKs5ntZ8=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=F7Dsbg1ACHRopfkwf282Lw4tAvMlupvlIwO62Q46ggJKqyTl68bHUNbbMXTHEVX8T VU43j/4RUOjl1f4dOEGDeVFECMbimayUX/9Y77RMRquMqfFCh5/SjPv3Nllvu2Bv9x CITx2MkucSZz09IdybfZQFJceDep1qf1y5sRved8= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 08/15] qapi: job-change: support speed parameter Date: Wed, 13 Mar 2024 18:09:00 +0300 Message-Id: <20240313150907.623462-9-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342823656100006 Content-Type: text/plain; charset="utf-8" Allow change job speed through job-change command. Old block-job-set-speed would be deprecated soon. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/backup.c | 8 ++++++ block/commit.c | 10 ++++++- block/mirror.c | 60 ++++++++++++++++++++++++---------------- block/stream.c | 8 ++++++ blockjob.c | 13 +++++++++ include/block/blockjob.h | 7 +++++ include/qemu/job.h | 2 +- qapi/block-core.json | 23 +++++++++++++-- 8 files changed, 103 insertions(+), 28 deletions(-) diff --git a/block/backup.c b/block/backup.c index ec29d6b810..bf086dc5f9 100644 --- a/block/backup.c +++ b/block/backup.c @@ -336,6 +336,13 @@ static bool backup_cancel(Job *job, bool force) return true; } =20 +static bool backup_change(Job *job, JobChangeOptions *opts, Error **errp) +{ + BlockJob *bjob =3D container_of(job, BlockJob, job); + + return block_job_change(bjob, &opts->u.backup, errp); +} + static const BlockJobDriver backup_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(BackupBlockJob), @@ -348,6 +355,7 @@ static const BlockJobDriver backup_job_driver =3D { .clean =3D backup_clean, .pause =3D backup_pause, .cancel =3D backup_cancel, + .change =3D backup_change, }, .set_speed =3D backup_set_speed, }; diff --git a/block/commit.c b/block/commit.c index 7c3fdcb0ca..ccb6097679 100644 --- a/block/commit.c +++ b/block/commit.c @@ -204,6 +204,13 @@ static int coroutine_fn commit_run(Job *job, Error **e= rrp) return 0; } =20 +static bool commit_change(Job *job, JobChangeOptions *opts, Error **errp) +{ + BlockJob *bjob =3D container_of(job, BlockJob, job); + + return block_job_change(bjob, &opts->u.commit, errp); +} + static const BlockJobDriver commit_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(CommitBlockJob), @@ -213,7 +220,8 @@ static const BlockJobDriver commit_job_driver =3D { .run =3D commit_run, .prepare =3D commit_prepare, .abort =3D commit_abort, - .clean =3D commit_clean + .clean =3D commit_clean, + .change =3D commit_change, }, }; =20 diff --git a/block/mirror.c b/block/mirror.c index e670d0dd4f..f474b87079 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1251,41 +1251,45 @@ static bool commit_active_cancel(Job *job, bool for= ce) return force || !job_is_ready(job); } =20 -static void mirror_change(Job *job, JobChangeOptions *opts, Error **errp) +static bool mirror_change(Job *job, JobChangeOptions *opts, Error **errp) { + BlockJob *bjob =3D container_of(job, BlockJob, job); MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common.job); JobChangeOptionsMirror *change_opts =3D &opts->u.mirror; - MirrorCopyMode current; - - /* - * The implementation relies on the fact that copy_mode is only written - * under the BQL. Otherwise, further synchronization would be required. - */ + MirrorCopyMode old_mode; =20 GLOBAL_STATE_CODE(); =20 - if (!change_opts->has_copy_mode) { - /* Nothing to do */ - return; - } + if (change_opts->has_copy_mode) { + old_mode =3D qatomic_read(&s->copy_mode); =20 - if (qatomic_read(&s->copy_mode) =3D=3D change_opts->copy_mode) { - return; - } + if (old_mode !=3D change_opts->copy_mode) { + if (change_opts->copy_mode !=3D MIRROR_COPY_MODE_WRITE_BLOCKIN= G) { + error_setg(errp, "Change to copy mode '%s' is not implemen= ted", + MirrorCopyMode_str(change_opts->copy_mode)); + return false; + } =20 - if (change_opts->copy_mode !=3D MIRROR_COPY_MODE_WRITE_BLOCKING) { - error_setg(errp, "Change to copy mode '%s' is not implemented", - MirrorCopyMode_str(change_opts->copy_mode)); - return; + if (old_mode !=3D MIRROR_COPY_MODE_BACKGROUND) { + error_setg(errp, "Expected current copy mode '%s', got '%s= '", + MirrorCopyMode_str(MIRROR_COPY_MODE_BACKGROUND), + MirrorCopyMode_str(old_mode)); + return false; + } + } } =20 - current =3D qatomic_cmpxchg(&s->copy_mode, MIRROR_COPY_MODE_BACKGROUND, - change_opts->copy_mode); - if (current !=3D MIRROR_COPY_MODE_BACKGROUND) { - error_setg(errp, "Expected current copy mode '%s', got '%s'", - MirrorCopyMode_str(MIRROR_COPY_MODE_BACKGROUND), - MirrorCopyMode_str(current)); + if (!block_job_change(bjob, qapi_JobChangeOptionsMirror_base(change_op= ts), + errp)) + { + return false; } + + old_mode =3D qatomic_cmpxchg(&s->copy_mode, MIRROR_COPY_MODE_BACKGROUN= D, + change_opts->copy_mode); + assert(old_mode =3D=3D MIRROR_COPY_MODE_BACKGROUND); + + return true; } =20 static void mirror_query(BlockJob *job, BlockJobInfo *info) @@ -1315,6 +1319,13 @@ static const BlockJobDriver mirror_job_driver =3D { .query =3D mirror_query, }; =20 +static bool commit_active_change(Job *job, JobChangeOptions *opts, Error *= *errp) +{ + BlockJob *bjob =3D container_of(job, BlockJob, job); + + return block_job_change(bjob, &opts->u.commit, errp); +} + static const BlockJobDriver commit_active_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(MirrorBlockJob), @@ -1327,6 +1338,7 @@ static const BlockJobDriver commit_active_job_driver = =3D { .pause =3D mirror_pause, .complete =3D mirror_complete, .cancel =3D commit_active_cancel, + .change =3D commit_active_change, }, .drained_poll =3D mirror_drained_poll, }; diff --git a/block/stream.c b/block/stream.c index 7031eef12b..34f4588537 100644 --- a/block/stream.c +++ b/block/stream.c @@ -239,6 +239,13 @@ static int coroutine_fn stream_run(Job *job, Error **e= rrp) return error; } =20 +static bool stream_change(Job *job, JobChangeOptions *opts, Error **errp) +{ + BlockJob *bjob =3D container_of(job, BlockJob, job); + + return block_job_change(bjob, &opts->u.stream, errp); +} + static const BlockJobDriver stream_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(StreamBlockJob), @@ -248,6 +255,7 @@ static const BlockJobDriver stream_job_driver =3D { .prepare =3D stream_prepare, .clean =3D stream_clean, .user_resume =3D block_job_user_resume, + .change =3D stream_change, }, }; =20 diff --git a/blockjob.c b/blockjob.c index 2769722b37..d3cd4f4fbf 100644 --- a/blockjob.c +++ b/blockjob.c @@ -312,6 +312,19 @@ static bool block_job_set_speed(BlockJob *job, int64_t= speed, Error **errp) return block_job_set_speed_locked(job, speed, errp); } =20 +bool block_job_change(BlockJob *job, JobChangeOptionsBlockJob *opts, + Error **errp) +{ + GLOBAL_STATE_CODE(); + + if (!opts->has_speed) { + /* Nothing to do */ + return true; + } + + return block_job_set_speed(job, opts->speed, errp); +} + void block_job_ratelimit_processed_bytes(BlockJob *job, uint64_t n) { IO_CODE(); diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 72e849a140..fe433c8d35 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -224,4 +224,11 @@ bool block_job_is_internal(BlockJob *job); */ const BlockJobDriver *block_job_driver(BlockJob *job); =20 +/** + * Common part of .change handler for block-jobs. + * Applies changes described in opts to the job. + */ +bool block_job_change(BlockJob *job, JobChangeOptionsBlockJob *opts, + Error **errp); + #endif diff --git a/include/qemu/job.h b/include/qemu/job.h index d44cdb0cc8..1c9da74a0c 100644 --- a/include/qemu/job.h +++ b/include/qemu/job.h @@ -313,7 +313,7 @@ struct JobDriver { * * Note that this can already be called before the job coroutine is ru= nning. */ - void (*change)(Job *job, JobChangeOptions *opts, Error **errp); + bool (*change)(Job *job, JobChangeOptions *opts, Error **errp); =20 /** * Called when the job is freed. diff --git a/qapi/block-core.json b/qapi/block-core.json index f5cefa441b..93f96e747e 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3062,6 +3062,17 @@ { 'command': 'block-job-finalize', 'data': { 'id': 'str' }, 'allow-preconfig': true } =20 +## +# @JobChangeOptionsBlockJob: +# +# @speed: Change job speed (in bytes per second). Supported for +# for backup, mirror, commit and stream jobs. +# +# Since: 9.1 +## +{ 'struct': 'JobChangeOptionsBlockJob', + 'data': { '*speed' : 'uint64' } } + ## # @JobChangeOptionsMirror: # @@ -3071,12 +3082,17 @@ # Since: 8.2 ## { 'struct': 'JobChangeOptionsMirror', + 'base': 'JobChangeOptionsBlockJob', 'data': { '*copy-mode' : 'MirrorCopyMode' } } =20 + ## # @JobChangeOptions: # -# Block job options that can be changed after job creation. +# Job options that can be changed after job creation. When option is +# not specified the corresponding job parameter remains unchanged. +# The change is transactional: on success all changes are applied +# successfully, on failure nothing is changed. # # @id: The job identifier # @@ -3093,7 +3109,10 @@ 'base': { 'id': 'str', '*type': { 'type': 'JobType', 'features': ['deprecated'] } }, 'discriminator': 'JobType', - 'data': { 'mirror': 'JobChangeOptionsMirror' } } + 'data': { 'mirror': 'JobChangeOptionsMirror', + 'backup': 'JobChangeOptionsBlockJob', + 'stream': 'JobChangeOptionsBlockJob', + 'commit': 'JobChangeOptionsBlockJob' } } =20 ## # @block-job-change: --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342747; cv=none; d=zohomail.com; s=zohoarc; b=JmdSQ9rerZjgoxX2psqC+gwUYCtbm6Z7HllxNEBDhY0Ko4Jqx1u0DdSLieBYK/cqiwWXTKNndBGFeVu9J9+aQyn5pL8AxsrSji8gTtKZYMub4a+kmcr9tUIvfz+rZCZJ+B9Sbg3cuDzPZRl3kBlBqJVrA++hVdkRvDhTDFkHuvM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342747; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=WCIpyT0J+TRD9V0WFqJbUQtYMgyzqP59utLlBS1GDpE=; b=LTelWYd09hR6M5deWm3AjR9wYTlNfGjZY8UgZl/iIHkiFssWsHWalHDCD8A6lBM+M5Ka+8eLdQpkNPfA1nkABFmEWNhQUBtDoLlV48P2bbZ0iJXxb7IIXit66Usr32EX1BrovDqziz8d6YrvJSw7a+rx7AY3//8IqIqa9lTBH1A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342747146206.12873319969594; Wed, 13 Mar 2024 08:12:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEo-0003m5-4z; Wed, 13 Mar 2024 11:09:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEc-0003bE-97; Wed, 13 Mar 2024 11:09:38 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEa-0005u8-3B; Wed, 13 Mar 2024 11:09:38 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 6FE6160E62; Wed, 13 Mar 2024 18:09:34 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-vwBb8tYZ; Wed, 13 Mar 2024 18:09:33 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342573; bh=WCIpyT0J+TRD9V0WFqJbUQtYMgyzqP59utLlBS1GDpE=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=IBPSb9vUM5Tw8Qsb8Nk4ziMv1+o0O8c8nNqOoY5CGidQ4jph1lO62/aV5YbZ0Bpw8 3xRJ7kRtBEEVYcWk0oiY15YsYLw1VSwBGuQC4errBhzfp4DidT8kscSo7BxDlW8Cy+ ZHOGJEaXZgBakNpiESdfiC8uuOdirhTvr6OgPkeM= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 09/15] qapi: job-complete: introduce no-block-replace option for mirror Date: Wed, 13 Mar 2024 18:09:01 +0300 Message-Id: <20240313150907.623462-10-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342749304100003 Content-Type: text/plain; charset="utf-8" That's an alternative to block-job-cancel(hard=3Dfalse) behavior for mirror, which exactly is: complete the job, wait for in-flight requests, but don't do any block graph modifications. Why: 1. We move to deprecating block-job-* APIs and use job-* APIs instead. So we need to port somehow the functionality to job- API. 2. The specified behavior was also a kind of "quirk". It's strange to "cancel" something in a normal success path of user scenario. This block-job-cancel(hard=3Dfalse) results in BLOCK_JOB_COMPLETE event, so definitely it's just another mode of "complete", not "cancel". Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/mirror.c | 8 +++++--- include/qemu/job.h | 8 +++++++- job-qmp.c | 20 +++++++++++++++----- job.c | 12 ++++++++++-- qapi/job.json | 28 +++++++++++++++++++++++++--- stubs/qapi-jobchangeoptions-mapper.c | 5 +++++ tests/unit/test-bdrv-drain.c | 2 +- tests/unit/test-block-iothread.c | 2 +- tests/unit/test-blockjob.c | 2 +- 9 files changed, 70 insertions(+), 17 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index f474b87079..e95c54fbc6 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -69,6 +69,7 @@ typedef struct MirrorBlockJob { */ bool actively_synced; bool should_complete; + bool no_block_replace; int64_t granularity; size_t buf_size; int64_t bdev_length; @@ -740,7 +741,7 @@ static int mirror_exit_common(Job *job) } bdrv_graph_rdunlock_main_loop(); =20 - if (s->should_complete && !abort) { + if (s->should_complete && !abort && !s->no_block_replace) { BlockDriverState *to_replace =3D s->to_replace ?: src; bool ro =3D bdrv_is_read_only(to_replace); =20 @@ -1167,7 +1168,7 @@ immediate_exit: return ret; } =20 -static void mirror_complete(Job *job, Error **errp) +static void mirror_complete(Job *job, JobComplete *opts, Error **errp) { MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common.job); =20 @@ -1178,7 +1179,7 @@ static void mirror_complete(Job *job, Error **errp) } =20 /* block all operations on to_replace bs */ - if (s->replaces) { + if (s->replaces && !opts->u.mirror.no_block_replace) { s->to_replace =3D bdrv_find_node(s->replaces); if (!s->to_replace) { error_setg(errp, "Node name '%s' not found", s->replaces); @@ -1193,6 +1194,7 @@ static void mirror_complete(Job *job, Error **errp) } =20 s->should_complete =3D true; + s->no_block_replace =3D opts->u.mirror.no_block_replace; =20 /* If the job is paused, it will be re-entered when it is resumed */ WITH_JOB_LOCK_GUARD() { diff --git a/include/qemu/job.h b/include/qemu/job.h index 1c9da74a0c..eee1d5b50f 100644 --- a/include/qemu/job.h +++ b/include/qemu/job.h @@ -254,7 +254,7 @@ struct JobDriver { * Optional callback for job types whose completion must be triggered * manually. */ - void (*complete)(Job *job, Error **errp); + void (*complete)(Job *job, JobComplete *opts, Error **errp); =20 /** * If the callback is not NULL, prepare will be invoked when all the j= obs @@ -634,6 +634,12 @@ void job_early_fail(Job *job); */ void job_transition_to_ready(Job *job); =20 +/** + * Asynchronously complete the specified @job. + * Called with job lock held, but might release it temporarily. + */ +void job_complete_opts_locked(Job *job, JobComplete *opts, Error **errp); + /** * Asynchronously complete the specified @job. * Called with job lock held, but might release it temporarily. diff --git a/job-qmp.c b/job-qmp.c index 011a8736ea..c048e03d9f 100644 --- a/job-qmp.c +++ b/job-qmp.c @@ -93,19 +93,19 @@ void qmp_job_resume(const char *id, Error **errp) job_user_resume_locked(job, errp); } =20 -void qmp_job_complete(const char *id, Error **errp) +void qmp_job_complete(JobComplete *opts, Error **errp) { Job *job; =20 JOB_LOCK_GUARD(); - job =3D find_job_locked(id, errp); + job =3D find_job_locked(opts->id, errp); =20 if (!job) { return; } =20 trace_qmp_job_complete(job); - job_complete_locked(job, errp); + job_complete_opts_locked(job, opts, errp); } =20 void qmp_job_finalize(const char *id, Error **errp) @@ -204,13 +204,13 @@ JobInfoList *qmp_query_jobs(Error **errp) return head; } =20 -bool JobChangeOptions_mapper(JobChangeOptions *opts, JobType *out, Error *= *errp) +static bool job_mapper(const char *id, JobType *out, Error **errp) { Job *job; =20 JOB_LOCK_GUARD(); =20 - job =3D find_job_locked(opts->id, errp); + job =3D find_job_locked(id, errp); if (!job) { return false; } @@ -218,3 +218,13 @@ bool JobChangeOptions_mapper(JobChangeOptions *opts, J= obType *out, Error **errp) *out =3D job_type(job); return true; } + +bool JobChangeOptions_mapper(JobChangeOptions *opts, JobType *out, Error *= *errp) +{ + return job_mapper(opts->id, out, errp); +} + +bool JobComplete_mapper(JobComplete *opts, JobType *out, Error **errp) +{ + return job_mapper(opts->id, out, errp); +} diff --git a/job.c b/job.c index 69630852dc..3726ba2c9e 100644 --- a/job.c +++ b/job.c @@ -1214,11 +1214,14 @@ int job_complete_sync_locked(Job *job, Error **errp) return job_finish_sync_locked(job, job_complete_locked, errp); } =20 -void job_complete_locked(Job *job, Error **errp) +void job_complete_opts_locked(Job *job, JobComplete *opts, Error **errp) { + JobComplete local_opts =3D {}; + /* Should not be reachable via external interface for internal jobs */ assert(job->id); GLOBAL_STATE_CODE(); + if (job_apply_verb_locked(job, JOB_VERB_COMPLETE, errp)) { return; } @@ -1229,10 +1232,15 @@ void job_complete_locked(Job *job, Error **errp) } =20 job_unlock(); - job->driver->complete(job, errp); + job->driver->complete(job, opts ?: &local_opts, errp); job_lock(); } =20 +void job_complete_locked(Job *job, Error **errp) +{ + job_complete_opts_locked(job, NULL, errp); +} + int job_finish_sync_locked(Job *job, void (*finish)(Job *, Error **errp), Error **errp) diff --git a/qapi/job.json b/qapi/job.json index b3957207a4..2f1b839cfc 100644 --- a/qapi/job.json +++ b/qapi/job.json @@ -182,15 +182,37 @@ { 'command': 'job-cancel', 'data': { 'id': 'str' } } =20 ## -# @job-complete: +# @JobCompleteMirror: # -# Manually trigger completion of an active job in the READY state. +# @no-block-replace: Supported only for mirror job. If true, alter +# the mirror job completion behavior so that final switch to +# target block node is not done. Since 9.1 +# +# Since: 9.1 +## +{ 'struct': 'JobCompleteMirror', + 'data': { '*no-block-replace': 'bool' } } + +## +# @JobComplete: # # @id: The job identifier. # # Since: 3.0 ## -{ 'command': 'job-complete', 'data': { 'id': 'str' } } +{ 'union': 'JobComplete', + 'base': { 'id': 'str' }, + 'discriminator': 'JobType', + 'data': { 'mirror': 'JobCompleteMirror' } } + +## +# @job-complete: +# +# Manually trigger completion of an active job in the READY state. +# +# Since: 3.0 +## +{ 'command': 'job-complete', 'data': 'JobComplete', 'boxed': true } =20 ## # @job-dismiss: diff --git a/stubs/qapi-jobchangeoptions-mapper.c b/stubs/qapi-jobchangeopt= ions-mapper.c index e4acfd91b3..8031a5317c 100644 --- a/stubs/qapi-jobchangeoptions-mapper.c +++ b/stubs/qapi-jobchangeoptions-mapper.c @@ -6,3 +6,8 @@ bool JobChangeOptions_mapper(JobChangeOptions *opts, JobTyp= e *out, Error **errp) { g_assert_not_reached(); } + +bool JobComplete_mapper(JobComplete *opts, JobType *out, Error **errp) +{ + g_assert_not_reached(); +} diff --git a/tests/unit/test-bdrv-drain.c b/tests/unit/test-bdrv-drain.c index 666880472b..933d3dd990 100644 --- a/tests/unit/test-bdrv-drain.c +++ b/tests/unit/test-bdrv-drain.c @@ -682,7 +682,7 @@ static int coroutine_fn test_job_run(Job *job, Error **= errp) return s->run_ret; } =20 -static void test_job_complete(Job *job, Error **errp) +static void test_job_complete(Job *job, JobComplete *opts, Error **errp) { TestBlockJob *s =3D container_of(job, TestBlockJob, common.job); s->should_complete =3D true; diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothr= ead.c index 3766d5de6b..dce33a8b9b 100644 --- a/tests/unit/test-block-iothread.c +++ b/tests/unit/test-block-iothread.c @@ -529,7 +529,7 @@ static int coroutine_fn test_job_run(Job *job, Error **= errp) return 0; } =20 -static void test_job_complete(Job *job, Error **errp) +static void test_job_complete(Job *job, JobComplete *opts, Error **errp) { TestBlockJob *s =3D container_of(job, TestBlockJob, common.job); s->should_complete =3D true; diff --git a/tests/unit/test-blockjob.c b/tests/unit/test-blockjob.c index fe3e0d2d38..027a2dd886 100644 --- a/tests/unit/test-blockjob.c +++ b/tests/unit/test-blockjob.c @@ -165,7 +165,7 @@ typedef struct CancelJob { bool should_complete; } CancelJob; =20 -static void cancel_job_complete(Job *job, Error **errp) +static void cancel_job_complete(Job *job, JobComplete *opts, Error **errp) { CancelJob *s =3D container_of(job, CancelJob, common.job); s->should_complete =3D true; --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342620; cv=none; d=zohomail.com; s=zohoarc; b=cDSdG6kHIw+QZPBJ+helJmtUECOYtUebJSS8yxQRYsWkxuKH+Fsn0rZ63OLD/CEzvMw19XoELzrRHjI94kJG+kT2cY0KkoFAPpfhNIuu2ALfX1N8j/0DP6w0r7AuCWAKqWADCdZOfZ5Qi3RSaU/5vbhaSs70oU2KOPh/phXNAAs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342620; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=liHibTBSkdOt/5J9R1x/HYZXfHhL5kuhxB6+ewel9tw=; b=ir0QLYlSVb7FJuTbKE53dlQkXWvXmIFN8yPt3/lzydr0bWYY3fmAE79eOb3zv+k/EbcmPBDcEhCz1MPloku0YyeJrAXCqSWFGFOHaanP9Mmx4cDF37eAbU+nE0CbjKwg6iTr+L9hzVqpt+FvFFgjFKyLFRS9MUt3gkK+1JORXhs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342620554409.71949739572483; Wed, 13 Mar 2024 08:10:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEm-0003jL-MZ; Wed, 13 Mar 2024 11:09:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEd-0003bd-UD; Wed, 13 Mar 2024 11:09:40 -0400 Received: from forwardcorp1c.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEc-0005ub-4U; Wed, 13 Mar 2024 11:09:39 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 5EFE860DBC; Wed, 13 Mar 2024 18:09:35 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-c2AmYShI; Wed, 13 Mar 2024 18:09:34 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342574; bh=liHibTBSkdOt/5J9R1x/HYZXfHhL5kuhxB6+ewel9tw=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=DCMqfg7gL7mJlFm7JH+TGuAacMKjTeOo1wRaid8wLbEsxpXU3dAJhRJtIclFkmDb5 ISUC1+3fyzVB6Jwh3aNj4GSJBgbA1LQDTiY/FUaM96ZAzXoUxbrscLXvhFlEjdXSMt oHVtPbkSIrPBYIopB15DPDzSjk/xosUZCxDGjsaA= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 10/15] qapi: query-jobs: add information specific for job type Date: Wed, 13 Mar 2024 18:09:02 +0300 Message-Id: <20240313150907.623462-11-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342623172100001 Content-Type: text/plain; charset="utf-8" Duplicate the feature from query-block-jobs. It's a step to finally deprecate query-block-jobs command and move to query-jobs. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/mirror.c | 14 ++++++++++++-- include/qemu/job.h | 5 +++++ job-qmp.c | 6 ++++++ qapi/job.json | 22 +++++++++++++++++++--- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index e95c54fbc6..96dcbbc3e8 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1294,7 +1294,7 @@ static bool mirror_change(Job *job, JobChangeOptions = *opts, Error **errp) return true; } =20 -static void mirror_query(BlockJob *job, BlockJobInfo *info) +static void mirror_query_old(BlockJob *job, BlockJobInfo *info) { MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common); =20 @@ -1303,6 +1303,15 @@ static void mirror_query(BlockJob *job, BlockJobInfo= *info) }; } =20 +static void mirror_query(Job *job, JobInfo *info) +{ + MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common.job); + + info->u.mirror =3D (JobInfoMirror) { + .actively_synced =3D qatomic_read(&s->actively_synced), + }; +} + static const BlockJobDriver mirror_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(MirrorBlockJob), @@ -1316,9 +1325,10 @@ static const BlockJobDriver mirror_job_driver =3D { .complete =3D mirror_complete, .cancel =3D mirror_cancel, .change =3D mirror_change, + .query =3D mirror_query, }, .drained_poll =3D mirror_drained_poll, - .query =3D mirror_query, + .query =3D mirror_query_old, }; =20 static bool commit_active_change(Job *job, JobChangeOptions *opts, Error *= *errp) diff --git a/include/qemu/job.h b/include/qemu/job.h index eee1d5b50f..8a238b8658 100644 --- a/include/qemu/job.h +++ b/include/qemu/job.h @@ -315,6 +315,11 @@ struct JobDriver { */ bool (*change)(Job *job, JobChangeOptions *opts, Error **errp); =20 + /* + * Query information specific to this kind of block job. + */ + void (*query)(Job *job, JobInfo *info); + /** * Called when the job is freed. */ diff --git a/job-qmp.c b/job-qmp.c index c048e03d9f..9643c5424d 100644 --- a/job-qmp.c +++ b/job-qmp.c @@ -177,6 +177,12 @@ static JobInfo *job_query_single_locked(Job *job, Erro= r **errp) g_strdup(error_get_pretty(job->err)) : NULL, }; =20 + if (job->driver->query) { + job_unlock(); + job->driver->query(job, info); + job_lock(); + } + return info; } =20 diff --git a/qapi/job.json b/qapi/job.json index 2f1b839cfc..036fec1b57 100644 --- a/qapi/job.json +++ b/qapi/job.json @@ -251,6 +251,20 @@ ## { 'command': 'job-finalize', 'data': { 'id': 'str' } } =20 +## +# @JobInfoMirror: +# +# Information specific to mirror block jobs. +# +# @actively-synced: Whether the source is actively synced to the +# target, i.e. same data and new writes are done synchronously to +# both. +# +# Since: 9.1 +## +{ 'struct': 'JobInfoMirror', + 'data': { 'actively-synced': 'bool' } } + ## # @JobInfo: # @@ -281,10 +295,12 @@ # # Since: 3.0 ## -{ 'struct': 'JobInfo', - 'data': { 'id': 'str', 'type': 'JobType', 'status': 'JobStatus', +{ 'union': 'JobInfo', + 'base': { 'id': 'str', 'type': 'JobType', 'status': 'JobStatus', 'current-progress': 'int', 'total-progress': 'int', - '*error': 'str' } } + '*error': 'str' }, + 'discriminator': 'type', + 'data': { 'mirror': 'JobInfoMirror' } } =20 ## # @query-jobs: --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342756; cv=none; d=zohomail.com; s=zohoarc; b=g65qfSDCg6B/ePueNqFCbJPmJI7nXvyPmh5Pzisqtg0FtPdXW60l8geW7ISE7Yt/WxHesUdz9OXOwH4qBx2+LENHk9aXX9ie7NePveTPSaLyMnANqU7AQo/pk13hpepig6Xo30mf9WXh1ZBeb3LEKXSthP3TX28NLubWHIiq7wE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342756; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=A1BY/pFcCKjtke681ulBTN+3FD51P3WVGDNwn/IH6Pc=; b=Hbv8hO/TucR7FawodVDkzRIu1pFfFE50IGVzzvFc0n8/CZewtVTCGvpYcv3LDbYel5RMYGJMWgRbWx1L8kZwD28l6ksuvSwVV/77KbSJIyJ0Is5bqENgvID105z5UAp6RVkixQeZnzPQIkoxkQB4aazfilRRWitXTOLErInJ8xc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17103427564628.416687404324307; Wed, 13 Mar 2024 08:12:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQF1-0003yo-0i; Wed, 13 Mar 2024 11:10:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEd-0003bb-Mc; Wed, 13 Mar 2024 11:09:40 -0400 Received: from forwardcorp1c.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEc-0005v2-2G; Wed, 13 Mar 2024 11:09:39 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 60FBA60DC4; Wed, 13 Mar 2024 18:09:36 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-rCUQI333; Wed, 13 Mar 2024 18:09:35 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342575; bh=A1BY/pFcCKjtke681ulBTN+3FD51P3WVGDNwn/IH6Pc=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=Pvjru6O/RqBrJxwlPSuSV78JeoCs2/omK+0/8axaubsXOsyADuWSoHC4LXBkNTkK6 oBIdr0zFm2MWH0Dx+MNodIWHOB1vMV3Gl1iYIryAtcGu0dOqqHQlKSJ057OsiYdkob wUioMUUGh+z0JUfi+OgxVE7CYuJ/cGUXjbdqPe6Y= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 11/15] job-qmp: job_query_single_locked: add assertion on job ret Date: Wed, 13 Mar 2024 18:09:03 +0300 Message-Id: <20240313150907.623462-12-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342757474100002 Content-Type: text/plain; charset="utf-8" job->ret must be always set together with job->err. Let's assert this. Reproting no-error to the user, when job->err is unset and job->ret is somehow set would be a bug. Signed-off-by: Vladimir Sementsov-Ogievskiy --- job-qmp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/job-qmp.c b/job-qmp.c index 9643c5424d..3e2172c26a 100644 --- a/job-qmp.c +++ b/job-qmp.c @@ -163,6 +163,7 @@ static JobInfo *job_query_single_locked(Job *job, Error= **errp) uint64_t progress_total; =20 assert(!job_is_internal(job)); + assert(!job->err =3D=3D !job->ret); progress_get_snapshot(&job->progress, &progress_current, &progress_total); =20 --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342706; cv=none; d=zohomail.com; s=zohoarc; b=mY3e2pLTg2j0+oRfMhLsA7VpSqQQZvCfUQ5fnjDaF3jf9ah+62+7vftRTTFchGsXAt7CvFzIZGKLB7zXrMhBt9tuwsH5c/2DyOTWl/zl2XWQHVH7KS5/GOK/xAqLc1LKJRSmIfDose7SUcHXLWKwFAd0zQAjqs2GYLS5WxSmGRk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342706; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=8U0ZcAt8pJ1rlaY1RKjn1zGvGLkE3X5Uz+owbI77koc=; b=dzeDS9fIIG0wE7T8Ibp8AXQpNKuYV6jpmvYqfXiLKr+Bcoc6Xo3cDSLsYBdDvxgh8z9RE2avGuLUPJhhWSX6kc4QTAQhhdhvhcJbvSDPkQsYjaVo25cNXeR//zYmIGqHo7BztCYpXOJM3o1rhgkDgYyHbAVbZYbD6QDj+agtEoE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342706300267.06297966242687; Wed, 13 Mar 2024 08:11:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEu-0003w2-7Y; Wed, 13 Mar 2024 11:09:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEf-0003cd-8y; Wed, 13 Mar 2024 11:09:42 -0400 Received: from forwardcorp1c.mail.yandex.net ([2a02:6b8:c03:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEd-0005ve-7t; Wed, 13 Mar 2024 11:09:40 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 8939760D9B; Wed, 13 Mar 2024 18:09:37 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-rhXfypM7; Wed, 13 Mar 2024 18:09:36 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342576; bh=8U0ZcAt8pJ1rlaY1RKjn1zGvGLkE3X5Uz+owbI77koc=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=ZBn07nNvNf4fdBbINEObe8lNQ8XKOoaSQz1MYcDAyzBXqC5YIl4humF54MyGB37kJ nw3oXFu1GcvTZNA95epFrcwSqiygkxFWYD2Me3234OdyiHOrQ5KdfBpz0vYEvpABHF Q4pTk/S1/E1GbyOegNYilMkQdNQ6a+aOBCBjRLnw= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 12/15] qapi: rename BlockDeviceIoStatus to IoStatus Date: Wed, 13 Mar 2024 18:09:04 +0300 Message-Id: <20240313150907.623462-13-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c03:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342707685100004 Content-Type: text/plain; charset="utf-8" This status is already shared between block-jobs and block-devices, so structure name is misleading a bit. We also will need to use the structure both in block-core.json and job.json. So give it more generic name first. The commit is made by commands: git grep -l BlockDeviceIoStatus | \ xargs sed -i 's/BlockDeviceIoStatus/IoStatus/g' git grep -l BLOCK_DEVICE_IO_STATUS | \ xargs sed -i 's/BLOCK_DEVICE_IO_STATUS/IO_STATUS/g' Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/block-backend.c | 14 +++++++------- block/mirror.c | 4 ++-- block/monitor/block-hmp-cmds.c | 4 ++-- blockjob.c | 10 +++++----- include/block/blockjob.h | 2 +- include/sysemu/block-backend-global-state.h | 2 +- qapi/block-core.json | 10 +++++----- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index 9c4de79e6b..ec19c50e96 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -65,7 +65,7 @@ struct BlockBackend { =20 BlockdevOnError on_read_error, on_write_error; bool iostatus_enabled; - BlockDeviceIoStatus iostatus; + IoStatus iostatus; =20 uint64_t perm; uint64_t shared_perm; @@ -1198,7 +1198,7 @@ void blk_iostatus_enable(BlockBackend *blk) { GLOBAL_STATE_CODE(); blk->iostatus_enabled =3D true; - blk->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; + blk->iostatus =3D IO_STATUS_OK; } =20 /* The I/O status is only enabled if the drive explicitly @@ -1212,7 +1212,7 @@ bool blk_iostatus_is_enabled(const BlockBackend *blk) blk->on_read_error =3D=3D BLOCKDEV_ON_ERROR_STOP)); } =20 -BlockDeviceIoStatus blk_iostatus(const BlockBackend *blk) +IoStatus blk_iostatus(const BlockBackend *blk) { GLOBAL_STATE_CODE(); return blk->iostatus; @@ -1228,7 +1228,7 @@ void blk_iostatus_reset(BlockBackend *blk) { GLOBAL_STATE_CODE(); if (blk_iostatus_is_enabled(blk)) { - blk->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; + blk->iostatus =3D IO_STATUS_OK; } } =20 @@ -1236,9 +1236,9 @@ void blk_iostatus_set_err(BlockBackend *blk, int erro= r) { IO_CODE(); assert(blk_iostatus_is_enabled(blk)); - if (blk->iostatus =3D=3D BLOCK_DEVICE_IO_STATUS_OK) { - blk->iostatus =3D error =3D=3D ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOS= PACE : - BLOCK_DEVICE_IO_STATUS_FAILED; + if (blk->iostatus =3D=3D IO_STATUS_OK) { + blk->iostatus =3D error =3D=3D ENOSPC ? IO_STATUS_NOSPACE : + IO_STATUS_FAILED; } } =20 diff --git a/block/mirror.c b/block/mirror.c index 96dcbbc3e8..8e672f3309 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -923,7 +923,7 @@ static int coroutine_fn mirror_run(Job *job, Error **er= rp) MirrorBDSOpaque *mirror_top_opaque =3D s->mirror_top_bs->opaque; BlockDriverState *target_bs =3D blk_bs(s->target); bool need_drain =3D true; - BlockDeviceIoStatus iostatus; + IoStatus iostatus; int64_t length; int64_t target_length; BlockDriverInfo bdi; @@ -1060,7 +1060,7 @@ static int coroutine_fn mirror_run(Job *job, Error **= errp) iostatus =3D s->common.iostatus; } if (delta < BLOCK_JOB_SLICE_TIME && - iostatus =3D=3D BLOCK_DEVICE_IO_STATUS_OK) { + iostatus =3D=3D IO_STATUS_OK) { if (s->in_flight >=3D MAX_IN_FLIGHT || s->buf_free_count =3D= =3D 0 || (cnt =3D=3D 0 && s->in_flight > 0)) { trace_mirror_yield(s, cnt, s->buf_free_count, s->in_flight= ); diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index d954bec6f1..64acb9cd6a 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -642,9 +642,9 @@ static void print_block_info(Monitor *mon, BlockInfo *i= nfo, if (info->qdev) { monitor_printf(mon, " Attached to: %s\n", info->qdev); } - if (info->has_io_status && info->io_status !=3D BLOCK_DEVICE_IO_ST= ATUS_OK) { + if (info->has_io_status && info->io_status !=3D IO_STATUS_OK) { monitor_printf(mon, " I/O status: %s\n", - BlockDeviceIoStatus_str(info->io_status)); + IoStatus_str(info->io_status)); } =20 if (info->removable) { diff --git a/blockjob.c b/blockjob.c index d3cd4f4fbf..de1dd03b2d 100644 --- a/blockjob.c +++ b/blockjob.c @@ -394,9 +394,9 @@ BlockJobInfo *block_job_query_locked(BlockJob *job, Err= or **errp) /* Called with job lock held */ static void block_job_iostatus_set_err_locked(BlockJob *job, int error) { - if (job->iostatus =3D=3D BLOCK_DEVICE_IO_STATUS_OK) { - job->iostatus =3D error =3D=3D ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOS= PACE : - BLOCK_DEVICE_IO_STATUS_FAILED; + if (job->iostatus =3D=3D IO_STATUS_OK) { + job->iostatus =3D error =3D=3D ENOSPC ? IO_STATUS_NOSPACE : + IO_STATUS_FAILED; } } =20 @@ -550,11 +550,11 @@ fail: void block_job_iostatus_reset_locked(BlockJob *job) { GLOBAL_STATE_CODE(); - if (job->iostatus =3D=3D BLOCK_DEVICE_IO_STATUS_OK) { + if (job->iostatus =3D=3D IO_STATUS_OK) { return; } assert(job->job.user_paused && job->job.pause_count > 0); - job->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; + job->iostatus =3D IO_STATUS_OK; } =20 static void block_job_iostatus_reset(BlockJob *job) diff --git a/include/block/blockjob.h b/include/block/blockjob.h index fe433c8d35..fd7ba1a285 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -50,7 +50,7 @@ typedef struct BlockJob { * Status that is published by the query-block-jobs QMP API. * Protected by job mutex. */ - BlockDeviceIoStatus iostatus; + IoStatus iostatus; =20 /** * Speed that was set with @block_job_set_speed. diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/b= lock-backend-global-state.h index 49c12b0fa9..a45643438f 100644 --- a/include/sysemu/block-backend-global-state.h +++ b/include/sysemu/block-backend-global-state.h @@ -66,7 +66,7 @@ int GRAPH_UNLOCKED blk_set_perm(BlockBackend *blk, uint64= _t perm, void blk_get_perm(BlockBackend *blk, uint64_t *perm, uint64_t *shared_perm= ); =20 void blk_iostatus_enable(BlockBackend *blk); -BlockDeviceIoStatus blk_iostatus(const BlockBackend *blk); +IoStatus blk_iostatus(const BlockBackend *blk); void blk_iostatus_disable(BlockBackend *blk); void blk_iostatus_reset(BlockBackend *blk); int blk_attach_dev(BlockBackend *blk, DeviceState *dev); diff --git a/qapi/block-core.json b/qapi/block-core.json index 93f96e747e..1f00d4f031 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -571,7 +571,7 @@ 'write_threshold': 'int', '*dirty-bitmaps': ['BlockDirtyInfo']= } } =20 ## -# @BlockDeviceIoStatus: +# @IoStatus: # # An enumeration of block device I/O status. # @@ -584,7 +584,7 @@ # # Since: 1.0 ## -{ 'enum': 'BlockDeviceIoStatus', 'data': [ 'ok', 'failed', 'nospace' ] } +{ 'enum': 'IoStatus', 'data': [ 'ok', 'failed', 'nospace' ] } =20 ## # @BlockDirtyInfo: @@ -705,7 +705,7 @@ # @tray_open: True if the device's tray is open (only present if it # has a tray) # -# @io-status: @BlockDeviceIoStatus. Only present if the device +# @io-status: @IoStatus. Only present if the device # supports it and the VM is configured to stop on errors # (supported device models: virtio-blk, IDE, SCSI except # scsi-generic) @@ -718,7 +718,7 @@ { 'struct': 'BlockInfo', 'data': {'device': 'str', '*qdev': 'str', 'type': 'str', 'removable': 'b= ool', 'locked': 'bool', '*inserted': 'BlockDeviceInfo', - '*tray_open': 'bool', '*io-status': 'BlockDeviceIoStatus' } } + '*tray_open': 'bool', '*io-status': 'IoStatus' } } =20 ## # @BlockMeasureInfo: @@ -1424,7 +1424,7 @@ { 'union': 'BlockJobInfo', 'base': {'type': 'JobType', 'device': 'str', 'len': 'int', 'offset': 'int', 'busy': 'bool', 'paused': 'bool', 'speed': 'in= t', - 'io-status': 'BlockDeviceIoStatus', 'ready': 'bool', + 'io-status': 'IoStatus', 'ready': 'bool', 'status': 'JobStatus', 'auto-finalize': 'bool', 'auto-dismiss': 'bool', '*error': 'str' }, --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342850; cv=none; d=zohomail.com; s=zohoarc; b=mz9cRG1qCxxCmXyXV7qIdo5p3f0OKntelFr8Y2WGyfXNdBUSaV4zEs+0XlAAOqMSBZ6i7XMFOAOzO4KWD4xPEH0kRbnM/rpl0x+z9BvN3L9wNBI9THXJ2wWLwcrHFXOL3KjOeNCSf6dJ16CQWs2o8XzBJw8QSH/HtWzaptQvmP4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342850; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=smUXyHkMuIz0DGcbLHOFuueaFXuHhhxrcKuIjG0mGJs=; b=WY/Mxi3yf1FAbpfn1YuOTUIZy5guwpM2Vuzh0LtzY7nCLJg6JF1Op1QozB/Gw8H2fT8mU5DysBU4JhT16ZwIS6u+1y/N9xNgVVBT+KN0r6ufiaqMzmAhWlqoUp499c0IjBvEZCcuO/UDZmi6hbMGC0OC9CvNbBccGgGscxzO7PI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 171034285074939.74159730979363; Wed, 13 Mar 2024 08:14:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEr-0003ty-Kc; Wed, 13 Mar 2024 11:09:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEg-0003cn-3G; Wed, 13 Mar 2024 11:09:42 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEe-0005w0-J3; Wed, 13 Mar 2024 11:09:41 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 9020060E68; Wed, 13 Mar 2024 18:09:38 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-Q1M48Pj3; Wed, 13 Mar 2024 18:09:37 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342577; bh=smUXyHkMuIz0DGcbLHOFuueaFXuHhhxrcKuIjG0mGJs=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=D8jdFgEpcnvO71fzBOV9yfpHB0VfJG1rr1+pl6IR3OzgpJB+z3GG7vrwnigDLFjTJ AHSPh1oZIH9GM9ZL6dZLz8yLB5F3LjY+5GUpGVROtwfbfVaytriugwuN+2r46vkzdj etCRbb1OG2m4A5q0A3pgILxSk/k11Q9rKsp+eZO4= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 13/15] qapi: move IoStatus to common.json Date: Wed, 13 Mar 2024 18:09:05 +0300 Message-Id: <20240313150907.623462-14-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342851719100001 Content-Type: text/plain; charset="utf-8" We will need to use the structure both in block-core.json and job.json. So, move it to common.json, which could be then included to job.json. Signed-off-by: Vladimir Sementsov-Ogievskiy --- qapi/block-core.json | 16 ---------------- qapi/common.json | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 1f00d4f031..75c02e1586 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -570,22 +570,6 @@ '*iops_size': 'int', '*group': 'str', 'cache': 'BlockdevCacheI= nfo', 'write_threshold': 'int', '*dirty-bitmaps': ['BlockDirtyInfo']= } } =20 -## -# @IoStatus: -# -# An enumeration of block device I/O status. -# -# @ok: The last I/O operation has succeeded -# -# @failed: The last I/O operation has failed -# -# @nospace: The last I/O operation has failed due to a no-space -# condition -# -# Since: 1.0 -## -{ 'enum': 'IoStatus', 'data': [ 'ok', 'failed', 'nospace' ] } - ## # @BlockDirtyInfo: # diff --git a/qapi/common.json b/qapi/common.json index f1bb841951..3becca1300 100644 --- a/qapi/common.json +++ b/qapi/common.json @@ -19,6 +19,22 @@ { 'enum': 'IoOperationType', 'data': [ 'read', 'write' ] } =20 +## +# @IoStatus: +# +# An enumeration of block device I/O status. +# +# @ok: The last I/O operation has succeeded +# +# @failed: The last I/O operation has failed +# +# @nospace: The last I/O operation has failed due to a no-space +# condition +# +# Since: 1.0 +## +{ 'enum': 'IoStatus', 'data': [ 'ok', 'failed', 'nospace' ] } + ## # @OnOffAuto: # --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342770; cv=none; d=zohomail.com; s=zohoarc; b=VHm5Bl3tmwAEIqpgK6t+vQtJNYupY00WAJFl4szIbXY8goXbMFKXy1wi9ux4IjPFVYJXmH7idMZWyZqF+o0BEZKmWheXXM1NTSGNe0D/0TDOsbWeVQcbBAP5wJ2oVQjfpD+fLjl9a4DHm4A/7q/jw7IJKfcWtYaP8kuvJcP4U80= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342770; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=uHlV1VxR+xuxKKQhx3yCtAq9mela0KYBVFHBDmPaDZ0=; b=hId5Q65OLcZsR8LTJh8y7BQp84+WFATR2ItuFJpta0WXX/lowCvYurg2a9wndHK4FHl+Y6sF6Ci+VlsrXvkcvKU+OJ0PGTvDNJ5Q+2XuAKFf9Xf4B9huC7ssL0laM4myRNYS2g12VAYtXAHDvP56mnHv1z9nsgJHfPMdZ1Cnnxw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342769982881.0081537967127; Wed, 13 Mar 2024 08:12:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEo-0003nv-DW; Wed, 13 Mar 2024 11:09:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEg-0003cx-Vu; Wed, 13 Mar 2024 11:09:43 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEf-0005wK-5h; Wed, 13 Mar 2024 11:09:42 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTPS id 8B74B60E6F; Wed, 13 Mar 2024 18:09:39 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-DuSxYLHO; Wed, 13 Mar 2024 18:09:38 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342578; bh=uHlV1VxR+xuxKKQhx3yCtAq9mela0KYBVFHBDmPaDZ0=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=f7UwSCrJpI6dcBWdlPH4MBiVJT/daT7Kz2eszmbOrxRKCu16AkYdceGs96XKbLRoW ahqYAAET12k9hdkmnbMzgzo99OI0HiGCVFJET46GwCokhA2QCEKiCkIVcnbd6U4t1E gQcURW+K6jhRPIJpab2ZyH/HYBED/gGCj1NujlIE= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 14/15] qapi: query-job: add block-job specific information Date: Wed, 13 Mar 2024 18:09:06 +0300 Message-Id: <20240313150907.623462-15-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342771573100003 Content-Type: text/plain; charset="utf-8" Add io-status and speed, which make sense only for block-jobs. This allows us to finally deprecate old query-block-jobs API in the next commit. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/backup.c | 6 ++++++ block/commit.c | 6 ++++++ block/mirror.c | 8 ++++++++ block/stream.c | 6 ++++++ blockjob.c | 10 ++++++++++ include/block/blockjob.h | 6 ++++++ qapi/job.json | 21 ++++++++++++++++++++- 7 files changed, 62 insertions(+), 1 deletion(-) diff --git a/block/backup.c b/block/backup.c index bf086dc5f9..55bbe85bf6 100644 --- a/block/backup.c +++ b/block/backup.c @@ -343,6 +343,11 @@ static bool backup_change(Job *job, JobChangeOptions *= opts, Error **errp) return block_job_change(bjob, &opts->u.backup, errp); } =20 +static void backup_query(Job *job, JobInfo *info) +{ + block_job_query(job, &info->u.backup); +} + static const BlockJobDriver backup_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(BackupBlockJob), @@ -356,6 +361,7 @@ static const BlockJobDriver backup_job_driver =3D { .pause =3D backup_pause, .cancel =3D backup_cancel, .change =3D backup_change, + .query =3D backup_query, }, .set_speed =3D backup_set_speed, }; diff --git a/block/commit.c b/block/commit.c index ccb6097679..9199a6adc8 100644 --- a/block/commit.c +++ b/block/commit.c @@ -211,6 +211,11 @@ static bool commit_change(Job *job, JobChangeOptions *= opts, Error **errp) return block_job_change(bjob, &opts->u.commit, errp); } =20 +static void commit_query(Job *job, JobInfo *info) +{ + block_job_query(job, &info->u.commit); +} + static const BlockJobDriver commit_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(CommitBlockJob), @@ -222,6 +227,7 @@ static const BlockJobDriver commit_job_driver =3D { .abort =3D commit_abort, .clean =3D commit_clean, .change =3D commit_change, + .query =3D commit_query, }, }; =20 diff --git a/block/mirror.c b/block/mirror.c index 8e672f3309..e8092d56be 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1310,6 +1310,8 @@ static void mirror_query(Job *job, JobInfo *info) info->u.mirror =3D (JobInfoMirror) { .actively_synced =3D qatomic_read(&s->actively_synced), }; + + block_job_query(job, qapi_JobInfoMirror_base(&info->u.mirror)); } =20 static const BlockJobDriver mirror_job_driver =3D { @@ -1338,6 +1340,11 @@ static bool commit_active_change(Job *job, JobChange= Options *opts, Error **errp) return block_job_change(bjob, &opts->u.commit, errp); } =20 +static void commit_active_query(Job *job, JobInfo *info) +{ + block_job_query(job, &info->u.commit); +} + static const BlockJobDriver commit_active_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(MirrorBlockJob), @@ -1351,6 +1358,7 @@ static const BlockJobDriver commit_active_job_driver = =3D { .complete =3D mirror_complete, .cancel =3D commit_active_cancel, .change =3D commit_active_change, + .query =3D commit_active_query, }, .drained_poll =3D mirror_drained_poll, }; diff --git a/block/stream.c b/block/stream.c index 34f4588537..e5e4d0bc77 100644 --- a/block/stream.c +++ b/block/stream.c @@ -246,6 +246,11 @@ static bool stream_change(Job *job, JobChangeOptions *= opts, Error **errp) return block_job_change(bjob, &opts->u.stream, errp); } =20 +static void stream_query(Job *job, JobInfo *info) +{ + block_job_query(job, &info->u.stream); +} + static const BlockJobDriver stream_job_driver =3D { .job_driver =3D { .instance_size =3D sizeof(StreamBlockJob), @@ -256,6 +261,7 @@ static const BlockJobDriver stream_job_driver =3D { .clean =3D stream_clean, .user_resume =3D block_job_user_resume, .change =3D stream_change, + .query =3D stream_query, }, }; =20 diff --git a/blockjob.c b/blockjob.c index de1dd03b2d..7dd1ed3ff2 100644 --- a/blockjob.c +++ b/blockjob.c @@ -306,6 +306,16 @@ bool block_job_set_speed_locked(BlockJob *job, int64_t= speed, Error **errp) return true; } =20 +void block_job_query(Job *job, JobInfoBlockJob *info) +{ + BlockJob *bjob =3D container_of(job, BlockJob, job); + + JOB_LOCK_GUARD(); + + info->speed =3D bjob->speed; + info->io_status =3D bjob->iostatus; +} + static bool block_job_set_speed(BlockJob *job, int64_t speed, Error **errp) { JOB_LOCK_GUARD(); diff --git a/include/block/blockjob.h b/include/block/blockjob.h index fd7ba1a285..bc33c2ba77 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -231,4 +231,10 @@ const BlockJobDriver *block_job_driver(BlockJob *job); bool block_job_change(BlockJob *job, JobChangeOptionsBlockJob *opts, Error **errp); =20 +/** + * Common part of .query handler for block-jobs. + * Adds block-job specific information to @info. + */ +void block_job_query(Job *job, JobInfoBlockJob *info); + #endif diff --git a/qapi/job.json b/qapi/job.json index 036fec1b57..7bd9f8112c 100644 --- a/qapi/job.json +++ b/qapi/job.json @@ -4,6 +4,7 @@ ## # =3D Background jobs ## +{ 'include': 'common.json' } =20 ## # @JobType: @@ -251,6 +252,20 @@ ## { 'command': 'job-finalize', 'data': { 'id': 'str' } } =20 +## +# @JobInfoBlockJob: +# +# Information specific to block jobs like mirror and backup. +# +# @io-status: the io status of the job +# +# @speed: the rate limit, bytes per second +# +# Since: 9.1 +## +{ 'struct': 'JobInfoBlockJob', + 'data': { 'io-status': 'IoStatus', 'speed': 'uint64' } } + ## # @JobInfoMirror: # @@ -263,6 +278,7 @@ # Since: 9.1 ## { 'struct': 'JobInfoMirror', + 'base': 'JobInfoBlockJob', 'data': { 'actively-synced': 'bool' } } =20 ## @@ -300,7 +316,10 @@ 'current-progress': 'int', 'total-progress': 'int', '*error': 'str' }, 'discriminator': 'type', - 'data': { 'mirror': 'JobInfoMirror' } } + 'data': { 'mirror': 'JobInfoMirror', + 'backup': 'JobInfoBlockJob', + 'stream': 'JobInfoBlockJob', + 'commit': 'JobInfoBlockJob' } } =20 ## # @query-jobs: --=20 2.34.1 From nobody Sun May 12 20:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1710342620; cv=none; d=zohomail.com; s=zohoarc; b=fLnGjcHhiV90HrcYVtosbiN3JbnRwhdSbMXq0cOgXAhzrbaDvODsI3SDv7lQWOCS06LKpy5D9scaRBV3EGEFQ8aCF7cbDRS5iS+3uJ3CFnLW/TK5bMgj9TxSgSiavflsDohSoB2yJTeGbuA7QG48DGzkKHJvKijIUIOn1GL2y0A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1710342620; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zZ0mJmmMXx0Ma28KnRdTxgIgXnMdPfvZcjlQY7vKVTk=; b=CtKxUMv97gBsqiNpC63hCS3DLPD8kQ4AtS/27W94LkXyW/3h+WDyX0r0+vu2dqh+BGb4W/eeh2IfbACJ8ipxQ1Jaj3FBBImhFqf26OERJHUkE7atQeeK/zIilZZtyXpGzD8SehksBP4irXwyaxsdf/68rg6umWO/wZT2DVtEmFY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1710342620760820.690810777931; Wed, 13 Mar 2024 08:10:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rkQEq-0003q9-7a; Wed, 13 Mar 2024 11:09:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEj-0003eC-20; Wed, 13 Mar 2024 11:09:45 -0400 Received: from forwardcorp1c.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rkQEg-0005wk-5f; Wed, 13 Mar 2024 11:09:43 -0400 Received: from mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net [IPv6:2a02:6b8:c08:8793:0:640:b059:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTPS id 94F9960A95; Wed, 13 Mar 2024 18:09:40 +0300 (MSK) Received: from vsementsov-lin.. (unknown [2a02:6b8:b081:7318::1:20]) by mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 99pZB52GZiE0-JHfDYuY9; Wed, 13 Mar 2024 18:09:39 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1710342579; bh=zZ0mJmmMXx0Ma28KnRdTxgIgXnMdPfvZcjlQY7vKVTk=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=M3VPzHR3RQxmRKskoAN0Ss5qNI12Mgfvn9ArfOKV/xXnkgt2+E20vsLN5GqNpkTEa JFsBuSL5xodXZScZQp/7Y7d50OlG67HnAvoqVukyTx7jcny2L4opzb07Huy0tsAhZL /s/fM8ShrXidoTDH6BmGKXad/GHPrNHOA7s+z6Ek= Authentication-Results: mail-nwsmtp-smtp-corp-main-34.sas.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, jsnow@redhat.com, vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com, devel@lists.libvirt.org, eblake@redhat.com, armbru@redhat.com, michael.roth@amd.com, pbonzini@redhat.com, pkrempa@redhat.com, f.ebner@proxmox.com Subject: [RFC 15/15] qapi/block-core: derpecate block-job- APIs Date: Wed, 13 Mar 2024 18:09:07 +0300 Message-Id: <20240313150907.623462-16-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240313150907.623462-1-vsementsov@yandex-team.ru> References: <20240313150907.623462-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=178.154.239.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1710342623251100003 Content-Type: text/plain; charset="utf-8" For change, pause, resume, complete, dismiss and finalize actions corresponding job- and block-job commands are almost equal. The difference is in find_block_job_locked() vs find_job_locked() functions. What's different? 1. find_block_job_locked() do check, is found job a block-job. This OK when moving to more generic API, no needs to document this change. 2. find_block_job_locked() reports DeviceNotActive on failure, when find_job_locked() reports GenericError. So, lets document this difference in deprecated.txt. Still, for dismiss and finalize errors are not documented at all, so be silent in deprecated.txt as well. For cancel, we have a new solution about soft-cancelling mirror: job-complete(no-block-replace=3Dtrue) For set-speed, the action is supported by job-change. For query, query-jobs is not equal to query-block-jobs, but now it has enough information (see documentation changes for details). Signed-off-by: Vladimir Sementsov-Ogievskiy --- docs/about/deprecated.rst | 73 +++++++++++++++++++++++++++++++++++++-- qapi/block-core.json | 59 ++++++++++++++++++++++++++++++- 2 files changed, 129 insertions(+), 3 deletions(-) diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index 5ff98ef95f..7db3ba983b 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -128,6 +128,75 @@ options are removed in favor of using explicit ``block= dev-create`` and ``blockdev-add`` calls. See :doc:`/interop/live-block-operations` for details. =20 +``block-job-pause`` (since 9.1) +''''''''''''''''''''''''''''''' + +Use ``job-pause`` instead. The only difference is that ``job-pause`` +always reports GenericError on failure when ``block-job-pause`` reports +DeviceNotActive when block-job is not found. + +``block-job-resume`` (since 9.1) +'''''''''''''''''''''''''''''''' + +Use ``job-resume`` instead. The only difference is that ``job-resume`` +always reports GenericError on failure when ``block-job-resume`` reports +DeviceNotActive when block-job is not found. + +``block-job-complete`` (since 9.1) +'''''''''''''''''''''''''''''''''' + +Use ``job-complete`` instead. The only difference is that ``job-complete`` +always reports GenericError on failure when ``block-job-complete`` reports +DeviceNotActive when block-job is not found. + +``block-job-dismiss`` (since 9.1) +''''''''''''''''''''''''''''''''' + +Use ``job-dismiss`` instead. + +``block-job-finalize`` (since 9.1) +'''''''''''''''''''''''''''''''''' + +Use ``job-finalize`` instead. + +``block-job-set-speed`` (since 9.1) +''''''''''''''''''''''''''''''''''' + +Use ``job-change`` instead. + +``block-job-change`` (since 9.1) +'''''''''''''''''''''''''''''''' + +Use ``job-change`` instead. + +``block-job-cancel`` (since 9.1) +'''''''''''''''''''''''''''''''' + +Use ``job-cancel`` instead which correspond to +``block-job-cancel`` (``force`` =3D true ). For special case of +soft-cancelling mirror in ready state, use ``job-complete`` +(``no-block-replace`` =3D true ). + +``query-block-jobs`` (since 9.1) + +Use ``query-jobs`` instead. Per-field recommendations: + +``query-block-jobs`` ``device`` field: use ``query-jobs`` ``id`` field. + +``query-block-jobs`` ``len`` and ``offset`` fields: use ``query-jobs`` +``current-progress`` and ``total-progress`` fields. + +``query-block-jobs`` ``paused``, ``ready``: +use ``qeury-jobs`` ``status``. + +``auto-finalize``, ``auto-dismiss``: these are parameters set by user +on job creation and never changed. So, no reason to query them. No +support in ``query-jobs``. + +``busy``: it actually means nothing for user, it's a mistake to rely on +it. No support in ``query-jobs``. + + Incorrectly typed ``device_add`` arguments (since 6.2) '''''''''''''''''''''''''''''''''''''''''''''''''''''' =20 @@ -143,8 +212,8 @@ all arguments passed to ``device_add`` are consistent w= ith the documented property types. =20 =20 -``block-job-change`` and ``job-change`` argument ``type`` (since 9.1) -'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +``job-change`` argument ``type`` (since 9.1) +'''''''''''''''''''''''''''''''''''''''''''' =20 QEMU can get job type from the job itself (by @id), @type field is redunda= nt. =20 diff --git a/qapi/block-core.json b/qapi/block-core.json index 75c02e1586..793155f174 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1422,9 +1422,15 @@ # # Returns: a list of @BlockJobInfo for each active block job # +# Features: +# +# @deprecated: This command is deprecated. Use @query-jobs +# instead. +# # Since: 1.1 ## { 'command': 'query-block-jobs', 'returns': ['BlockJobInfo'], + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -2875,6 +2881,11 @@ # @speed: the maximum speed, in bytes per second, or 0 for unlimited. # Defaults to 0. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-change +# instead. +# # Errors: # - If no background operation is active on this device, # DeviceNotActive @@ -2883,6 +2894,7 @@ ## { 'command': 'block-job-set-speed', 'data': { 'device': 'str', 'speed': 'int' }, + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -2919,13 +2931,22 @@ # paused) instead of waiting for the destination to complete its # final synchronization (since 1.3) # +# Features: +# +# @deprecated: This command is deprecated. Use @job-cancel +# instead which correspond to block-job-cancel(force=3Dtrue). +# For special case of soft-cancelling mirror in ready state, +# use job-complete(no-block-replace=3Dtrue) instead. +# # Errors: # - If no background operation is active on this device, # DeviceNotActive # # Since: 1.1 ## -{ 'command': 'block-job-cancel', 'data': { 'device': 'str', '*force': 'boo= l' }, +{ 'command': 'block-job-cancel', + 'features': ['deprecated'], + 'data': { 'device': 'str', '*force': 'bool' }, 'allow-preconfig': true } =20 ## @@ -2945,6 +2966,11 @@ # the name of the parameter), but since QEMU 2.7 it can have other # values. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-pause +# instead. +# # Errors: # - If no background operation is active on this device, # DeviceNotActive @@ -2952,6 +2978,7 @@ # Since: 1.3 ## { 'command': 'block-job-pause', 'data': { 'device': 'str' }, + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -2969,6 +2996,11 @@ # the name of the parameter), but since QEMU 2.7 it can have other # values. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-resume +# instead. +# # Errors: # - If no background operation is active on this device, # DeviceNotActive @@ -2976,6 +3008,7 @@ # Since: 1.3 ## { 'command': 'block-job-resume', 'data': { 'device': 'str' }, + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -3000,6 +3033,11 @@ # the name of the parameter), but since QEMU 2.7 it can have other # values. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-complete +# instead. +# # Errors: # - If no background operation is active on this device, # DeviceNotActive @@ -3007,6 +3045,7 @@ # Since: 1.3 ## { 'command': 'block-job-complete', 'data': { 'device': 'str' }, + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -3024,9 +3063,15 @@ # # @id: The job identifier. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-dismiss +# instead. +# # Since: 2.12 ## { 'command': 'block-job-dismiss', 'data': { 'id': 'str' }, + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -3041,9 +3086,15 @@ # # @id: The job identifier. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-finalize +# instead. +# # Since: 2.12 ## { 'command': 'block-job-finalize', 'data': { 'id': 'str' }, + 'features': ['deprecated'], 'allow-preconfig': true } =20 ## @@ -3103,9 +3154,15 @@ # # Change the block job's options. # +# Features: +# +# @deprecated: This command is deprecated. Use @job-change +# instead. +# # Since: 8.2 ## { 'command': 'block-job-change', + 'features': ['deprecated'], 'data': 'JobChangeOptions', 'boxed': true } =20 ## --=20 2.34.1