From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [PATCH] linux/pcifront: fix freeing of device Date: Mon, 04 Oct 2010 12:46:55 +0100 Message-ID: References: <4CA9D1F5020000780001A5AA@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <4CA9D1F5020000780001A5AA@vpn.id2.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Jan Beulich , "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org 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" wrote: > unbind_from_irqhandler() takes irq, not evtchn, as its first argument. > > Once at it, improve error handling. > > Signed-off-by: Jan Beulich > Reported-by: Rafal Wojtczuk > > --- 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