Jan Beulich
2010-Oct-04 11:09 UTC
[Xen-devel] [PATCH] linux/pcifront: fix freeing of device
unbind_from_irqhandler() takes irq, not evtchn, as its first argument. Once at it, improve error handling. Signed-off-by: Jan Beulich <jbeulich@novell.com> Reported-by: Rafal Wojtczuk <rafal@invisiblethingslab.com> --- a/drivers/xen/pcifront/pcifront.h +++ b/drivers/xen/pcifront/pcifront.h @@ -30,6 +30,7 @@ struct pcifront_device { int evtchn; int gnt_ref; + int irq; /* Lock this when doing any operations in sh_info */ spinlock_t sh_info_lock; --- a/drivers/xen/pcifront/xenbus.c +++ b/drivers/xen/pcifront/xenbus.c @@ -48,6 +48,7 @@ static struct pcifront_device *alloc_pde pdev->evtchn = INVALID_EVTCHN; pdev->gnt_ref = INVALID_GRANT_REF; + pdev->irq = -1; INIT_WORK(&pdev->op_work, pcifront_do_aer, pdev); @@ -65,7 +66,9 @@ static void free_pdev(struct pcifront_de /*For PCIE_AER error handling job*/ flush_scheduled_work(); - unbind_from_irqhandler(pdev->evtchn, pdev); + + if (pdev->irq > 0) + unbind_from_irqhandler(pdev->irq, pdev); if (pdev->evtchn != INVALID_EVTCHN) xenbus_free_evtchn(pdev->xdev, pdev->evtchn); @@ -73,6 +76,8 @@ static void free_pdev(struct pcifront_de if (pdev->gnt_ref != INVALID_GRANT_REF) gnttab_end_foreign_access(pdev->gnt_ref, (unsigned long)pdev->sh_info); + else + free_page((unsigned long)pdev->sh_info); pdev->xdev->dev.driver_data = NULL; @@ -94,8 +99,16 @@ static int pcifront_publish_info(struct if (err) goto out; - bind_caller_port_to_irqhandler(pdev->evtchn, pcifront_handler_aer, - SA_SAMPLE_RANDOM, "pcifront", pdev); + err = bind_caller_port_to_irqhandler(pdev->evtchn, + pcifront_handler_aer, + SA_SAMPLE_RANDOM, + "pcifront", pdev); + if (err < 0) { + xenbus_dev_fatal(pdev->xdev, err, + "Failed to bind event channel"); + goto out; + } + pdev->irq = err; do_publish: err = xenbus_transaction_start(&trans); @@ -428,6 +441,8 @@ static int pcifront_xenbus_probe(struct } err = pcifront_publish_info(pdev); + if (err) + free_pdev(pdev); out: return err; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2010-Oct-04 11:46 UTC
Re: [Xen-devel] [PATCH] linux/pcifront: fix freeing of device
Are the two patches you sent out for 2.6.18? If so, you need to make it clear. There are several Linux trees now and I''m ignoring Linux patches by default. -- Keir On 04/10/2010 12:09, "Jan Beulich" <JBeulich@novell.com> wrote:> unbind_from_irqhandler() takes irq, not evtchn, as its first argument. > > Once at it, improve error handling. > > Signed-off-by: Jan Beulich <jbeulich@novell.com> > Reported-by: Rafal Wojtczuk <rafal@invisiblethingslab.com> > > --- a/drivers/xen/pcifront/pcifront.h > +++ b/drivers/xen/pcifront/pcifront.h > @@ -30,6 +30,7 @@ struct pcifront_device { > > int evtchn; > int gnt_ref; > + int irq; > > /* Lock this when doing any operations in sh_info */ > spinlock_t sh_info_lock; > --- a/drivers/xen/pcifront/xenbus.c > +++ b/drivers/xen/pcifront/xenbus.c > @@ -48,6 +48,7 @@ static struct pcifront_device *alloc_pde > > pdev->evtchn = INVALID_EVTCHN; > pdev->gnt_ref = INVALID_GRANT_REF; > + pdev->irq = -1; > > INIT_WORK(&pdev->op_work, pcifront_do_aer, pdev); > > @@ -65,7 +66,9 @@ static void free_pdev(struct pcifront_de > > /*For PCIE_AER error handling job*/ > flush_scheduled_work(); > - unbind_from_irqhandler(pdev->evtchn, pdev); > + > + if (pdev->irq > 0) > + unbind_from_irqhandler(pdev->irq, pdev); > > if (pdev->evtchn != INVALID_EVTCHN) > xenbus_free_evtchn(pdev->xdev, pdev->evtchn); > @@ -73,6 +76,8 @@ static void free_pdev(struct pcifront_de > if (pdev->gnt_ref != INVALID_GRANT_REF) > gnttab_end_foreign_access(pdev->gnt_ref, > (unsigned long)pdev->sh_info); > + else > + free_page((unsigned long)pdev->sh_info); > > pdev->xdev->dev.driver_data = NULL; > > @@ -94,8 +99,16 @@ static int pcifront_publish_info(struct > if (err) > goto out; > > - bind_caller_port_to_irqhandler(pdev->evtchn, pcifront_handler_aer, > - SA_SAMPLE_RANDOM, "pcifront", pdev); > + err = bind_caller_port_to_irqhandler(pdev->evtchn, > + pcifront_handler_aer, > + SA_SAMPLE_RANDOM, > + "pcifront", pdev); > + if (err < 0) { > + xenbus_dev_fatal(pdev->xdev, err, > + "Failed to bind event channel"); > + goto out; > + } > + pdev->irq = err; > > do_publish: > err = xenbus_transaction_start(&trans); > @@ -428,6 +441,8 @@ static int pcifront_xenbus_probe(struct > } > > err = pcifront_publish_info(pdev); > + if (err) > + free_pdev(pdev); > > out: > return err; > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jan Beulich
2010-Oct-04 12:22 UTC
Re: [Xen-devel] [PATCH] linux/pcifront: fix freeing of device
>>> On 04.10.10 at 13:46, Keir Fraser <keir@xen.org> wrote: > Are the two patches you sent out for 2.6.18? If so, you need to make it > clear. There are several Linux trees now and I''m ignoring Linux patches by > default.Yes, they are. If distinguishing by the recipient (xen-devel vs. Jeremy) isn''t sufficient, I''ll state this explicitly in the future. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2010-Oct-04 12:23 UTC
Re: [Xen-devel] [PATCH] linux/pcifront: fix freeing of device
On 04/10/2010 13:22, "Jan Beulich" <JBeulich@novell.com> wrote:>>>> On 04.10.10 at 13:46, Keir Fraser <keir@xen.org> wrote: >> Are the two patches you sent out for 2.6.18? If so, you need to make it >> clear. There are several Linux trees now and I''m ignoring Linux patches by >> default. > > Yes, they are. If distinguishing by the recipient (xen-devel vs. Jeremy) > isn''t sufficient, I''ll state this explicitly in the future.Yes, put it in the subject line, thanks. K.> Jan >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel