[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20130520175706.GA27973@phenom.dumpdata.com>
Date: Mon, 20 May 2013 13:57:06 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@...cle.com>
To: Stefano Stabellini <stefano.stabellini@...citrix.com>
Cc: Zhenzhong Duan <zhenzhong.duan@...cle.com>,
"xen-devel@...ts.xensource.com" <xen-devel@...ts.xensource.com>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>,
"H. Peter Anvin" <hpa@...or.com>,
Yuval Shaia <yuval.shaia@...cle.com>,
Feng Jin <joe.jin@...cle.com>, Chien Yen <chien.yen@...cle.com>
Subject: Re: [PATCH] xen: reuse the same pirq allocated when driver load
first time
> > Hi Stefano,
> >
> > do you work out a patch for me to test?
>
> I'll be traveling/busy for a few weeks, maybe it's best if someone else
> picks up this work item.
This little test-case below should have worked:
#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/pagemap.h>
#include <linux/init.h>
#include <xen/xen.h>
#include <xen/page.h>
#include <asm/xen/hypervisor.h>
#include <xen/features.h>
#include <xen/events.h>
MODULE_AUTHOR("Konrad Rzeszutek Wilk <konrad.wilk@...cle.com>");
MODULE_DESCRIPTION("alloc_and_unmap");
MODULE_LICENSE("GPL");
MODULE_VERSION("0.1");
static int do_it(void)
{
struct physdev_get_free_pirq op_get_free_pirq;
struct physdev_unmap_pirq unmap_irq;
int rc, pirq;
op_get_free_pirq.type = MAP_PIRQ_TYPE_MSI;
rc = HYPERVISOR_physdev_op(PHYSDEVOP_get_free_pirq, &op_get_free_pirq);
if (rc) {
printk(KERN_WARNING "%s:%d rc:%d\n", __func__, __LINE__, rc);
return rc;
}
pirq = op_get_free_pirq.pirq;
unmap_irq.pirq = pirq;
unmap_irq.domid = DOMID_SELF;
rc = HYPERVISOR_physdev_op(PHYSDEVOP_unmap_pirq, &unmap_irq);
if (rc) {
printk(KERN_WARNING "unmap irq failed %d\n", rc);
return rc;
}
printk("PIRQ: %d\n", pirq);
return 0;
}
static int __init alloc_and_unmap_init(void)
{
int i;
for (i = 0; i < 10; i++)
if (do_it())
break;
return 0;
}
static void __exit alloc_and_unmap_exit(void)
{
}
module_init(alloc_and_unmap_init);
module_exit(alloc_and_unmap_exit);
But I get:
# insmod /alloc_and_unmap.ko
[ 34.899277] PIRQ: 55
[ 34.901846] PIRQ: 54
[ 34.904351] PIRQ: 53
[ 34.906921] PIRQ: 52
[ 34.909451] PIRQ: 51
[ 34.912038] PIRQ: 50
[ 34.914650] PIRQ: 49
[ 34.917205] PIRQ: 48
[ 34.919776] PIRQ: 47
[ 34.922339] PIRQ: 46
Which means there is some bug in the hypervisor as well (This is with Xen 4.3
and traditional QEMU - not that it matters as I am just doing these hypercalls).
At this point I think that upstream option is to save the PIRQ value and re-use it.
Will post a patch for it.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists