* [PATCH] linux/pcifront: fix freeing of device
@ 2010-10-04 11:09 Jan Beulich
2010-10-04 11:46 ` Keir Fraser
0 siblings, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2010-10-04 11:09 UTC (permalink / raw)
To: xen-devel@lists.xensource.com
[-- Attachment #1: Type: text/plain, Size: 2122 bytes --]
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;
[-- Attachment #2: xen-pcifront-irq-not-evtchn.patch --]
[-- Type: text/plain, Size: 2160 bytes --]
Subject: 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;
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] linux/pcifront: fix freeing of device
2010-10-04 11:09 [PATCH] linux/pcifront: fix freeing of device Jan Beulich
@ 2010-10-04 11:46 ` Keir Fraser
2010-10-04 12:22 ` Jan Beulich
0 siblings, 1 reply; 4+ messages in thread
From: Keir Fraser @ 2010-10-04 11:46 UTC (permalink / raw)
To: Jan Beulich, xen-devel@lists.xensource.com
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
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] linux/pcifront: fix freeing of device
2010-10-04 11:46 ` Keir Fraser
@ 2010-10-04 12:22 ` Jan Beulich
2010-10-04 12:23 ` Keir Fraser
0 siblings, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2010-10-04 12:22 UTC (permalink / raw)
To: Keir Fraser; +Cc: xen-devel@lists.xensource.com
>>> 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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] linux/pcifront: fix freeing of device
2010-10-04 12:22 ` Jan Beulich
@ 2010-10-04 12:23 ` Keir Fraser
0 siblings, 0 replies; 4+ messages in thread
From: Keir Fraser @ 2010-10-04 12:23 UTC (permalink / raw)
To: Jan Beulich; +Cc: xen-devel@lists.xensource.com
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
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-10-04 12:23 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-04 11:09 [PATCH] linux/pcifront: fix freeing of device Jan Beulich
2010-10-04 11:46 ` Keir Fraser
2010-10-04 12:22 ` Jan Beulich
2010-10-04 12:23 ` Keir Fraser
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).