From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH 2/3] x86/HVM: make vmsi_deliver() return proper error values Date: Tue, 03 Jun 2014 14:59:41 +0100 Message-ID: <538DF0ED0200007800017698@mail.emea.novell.com> References: <538DEF42020000780001767A@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=__PartBF8D6CDD.0__=" Return-path: Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WrpFh-0001Iv-Cp for xen-devel@lists.xenproject.org; Tue, 03 Jun 2014 13:59:45 +0000 In-Reply-To: <538DEF42020000780001767A@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel Cc: Keir Fraser List-Id: xen-devel@lists.xenproject.org This is a MIME message. If you are reading this text, you may want to consider changing to a mail reader or gateway that understands how to properly handle MIME multipart messages. --=__PartBF8D6CDD.0__= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline ... and propagate this from hvm_inject_msi(). In the course of this I spotted further room for cleanup: - vmsi_inj_irq()'s struct domain * parameter was unused - vmsi_deliver() pointlessly passed on dest_ExtINT to vmsi_inj_irq() (which that one validly refused to handle) - vmsi_inj_irq()'s sole caller guarantees a proper delivery mode (i.e. rather than printing an obscure message we can just BUG()) - some formatting and log message quirks Signed-off-by: Jan Beulich --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -311,9 +311,7 @@ int hvm_inject_msi(struct domain *d, uin return -ERANGE; } =20 - vmsi_deliver(d, vector, dest, dest_mode, delivery_mode, trig_mode); - - return 0; + return vmsi_deliver(d, vector, dest, dest_mode, delivery_mode, = trig_mode); } =20 void hvm_set_callback_via(struct domain *d, uint64_t via) --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -43,14 +43,12 @@ #include =20 static void vmsi_inj_irq( - struct domain *d, struct vlapic *target, uint8_t vector, uint8_t trig_mode, uint8_t delivery_mode) { - HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "vmsi_inj_irq " - "irq %d trig %d delive mode %d\n", + HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "vmsi_inj_irq: vec %02x trig %d dm = %d\n", vector, trig_mode, delivery_mode); =20 switch ( delivery_mode ) @@ -60,8 +58,7 @@ static void vmsi_inj_irq( vlapic_set_irq(target, vector, trig_mode); break; default: - gdprintk(XENLOG_WARNING, "error delivery mode %d\n", delivery_mode= ); - break; + BUG(); } } =20 @@ -76,38 +73,31 @@ int vmsi_deliver( switch ( delivery_mode ) { case dest_LowestPrio: - { target =3D vlapic_lowest_prio(d, NULL, 0, dest, dest_mode); if ( target !=3D NULL ) - vmsi_inj_irq(d, target, vector, trig_mode, delivery_mode); - else - HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "null round robin: " - "vector=3D%x delivery_mode=3D%x\n", - vector, dest_LowestPrio); - break; - } + { + vmsi_inj_irq(target, vector, trig_mode, delivery_mode); + break; + } + HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "null MSI round robin: vector=3D%02x= \n", + vector); + return -ESRCH; =20 case dest_Fixed: - case dest_ExtINT: - { for_each_vcpu ( d, v ) if ( vlapic_match_dest(vcpu_vlapic(v), NULL, 0, dest, dest_mode) ) - vmsi_inj_irq(d, vcpu_vlapic(v), - vector, trig_mode, delivery_mode); + vmsi_inj_irq(vcpu_vlapic(v), vector, + trig_mode, delivery_mode); break; - } =20 - case dest_SMI: - case dest_NMI: - case dest_INIT: - case dest__reserved_2: default: - gdprintk(XENLOG_WARNING, "Unsupported delivery mode %d\n", - delivery_mode); - break; + printk(XENLOG_G_WARNING + "%pv: Unsupported MSI delivery mode %d for Dom%d\n", + current, delivery_mode, d->domain_id); + return -EINVAL; } - return 1; + return 0; } =20 void vmsi_deliver_pirq(struct domain *d, const struct hvm_pirq_dpci = *pirq_dpci) --=__PartBF8D6CDD.0__= Content-Type: text/plain; name="x86-HVM-vmsi_deliver-retval.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="x86-HVM-vmsi_deliver-retval.patch" x86/HVM: make vmsi_deliver() return proper error values=0A=0A... and = propagate this from hvm_inject_msi(). In the course of this I=0Aspotted = further room for cleanup:=0A- vmsi_inj_irq()'s struct domain * parameter = was unused=0A- vmsi_deliver() pointlessly passed on dest_ExtINT to = vmsi_inj_irq()=0A (which that one validly refused to handle)=0A- = vmsi_inj_irq()'s sole caller guarantees a proper delivery mode (i.e.=0A = rather than printing an obscure message we can just BUG())=0A- some = formatting and log message quirks=0A=0ASigned-off-by: Jan Beulich = =0A=0A--- a/xen/arch/x86/hvm/irq.c=0A+++ b/xen/arch/x86/= hvm/irq.c=0A@@ -311,9 +311,7 @@ int hvm_inject_msi(struct domain *d, = uin=0A return -ERANGE;=0A }=0A =0A- vmsi_deliver(d, vector, = dest, dest_mode, delivery_mode, trig_mode);=0A-=0A- return 0;=0A+ = return vmsi_deliver(d, vector, dest, dest_mode, delivery_mode, trig_mode);= =0A }=0A =0A void hvm_set_callback_via(struct domain *d, uint64_t = via)=0A--- a/xen/arch/x86/hvm/vmsi.c=0A+++ b/xen/arch/x86/hvm/vmsi.c=0A@@ = -43,14 +43,12 @@=0A #include =0A =0A static void vmsi_inj_ir= q(=0A- struct domain *d,=0A struct vlapic *target,=0A uint8_t = vector,=0A uint8_t trig_mode,=0A uint8_t delivery_mode)=0A {=0A- = HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "vmsi_inj_irq "=0A- "irq %d = trig %d delive mode %d\n",=0A+ HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "vmsi_inj_i= rq: vec %02x trig %d dm %d\n",=0A vector, trig_mode, = delivery_mode);=0A =0A switch ( delivery_mode )=0A@@ -60,8 +58,7 @@ = static void vmsi_inj_irq(=0A vlapic_set_irq(target, vector, = trig_mode);=0A break;=0A default:=0A- gdprintk(XENLOG_WA= RNING, "error delivery mode %d\n", delivery_mode);=0A- break;=0A+ = BUG();=0A }=0A }=0A =0A@@ -76,38 +73,31 @@ int vmsi_deliver(=0A = switch ( delivery_mode )=0A {=0A case dest_LowestPrio:=0A- = {=0A target =3D vlapic_lowest_prio(d, NULL, 0, dest, dest_mode);=0A= if ( target !=3D NULL )=0A- vmsi_inj_irq(d, target, = vector, trig_mode, delivery_mode);=0A- else=0A- = HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "null round robin: "=0A- = "vector=3D%x delivery_mode=3D%x\n",=0A- vector, = dest_LowestPrio);=0A- break;=0A- }=0A+ {=0A+ = vmsi_inj_irq(target, vector, trig_mode, delivery_mode);=0A+ = break;=0A+ }=0A+ HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "null MSI = round robin: vector=3D%02x\n",=0A+ vector);=0A+ = return -ESRCH;=0A =0A case dest_Fixed:=0A- case dest_ExtINT:=0A- = {=0A for_each_vcpu ( d, v )=0A if ( vlapic_match_dest(v= cpu_vlapic(v), NULL,=0A 0, dest, = dest_mode) )=0A- vmsi_inj_irq(d, vcpu_vlapic(v),=0A- = vector, trig_mode, delivery_mode);=0A+ = vmsi_inj_irq(vcpu_vlapic(v), vector,=0A+ = trig_mode, delivery_mode);=0A break;=0A- }=0A =0A- case = dest_SMI:=0A- case dest_NMI:=0A- case dest_INIT:=0A- case = dest__reserved_2:=0A default:=0A- gdprintk(XENLOG_WARNING, = "Unsupported delivery mode %d\n",=0A- delivery_mode);=0A- = break;=0A+ printk(XENLOG_G_WARNING=0A+ "%pv: = Unsupported MSI delivery mode %d for Dom%d\n",=0A+ current, = delivery_mode, d->domain_id);=0A+ return -EINVAL;=0A }=0A- = return 1;=0A+ return 0;=0A }=0A =0A void vmsi_deliver_pirq(struct = domain *d, const struct hvm_pirq_dpci *pirq_dpci)=0A --=__PartBF8D6CDD.0__= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --=__PartBF8D6CDD.0__=--