#include #include #include #include #include #include #include #include #include MODULE_AUTHOR("Konrad Rzeszutek Wilk "); MODULE_DESCRIPTION("alloc_and_unmap"); MODULE_LICENSE("GPL"); MODULE_VERSION("0.1"); static int do_it(void) { int rc; struct physdev_get_free_pirq op_get_free_pirq; struct physdev_unmap_pirq unmap_irq; int 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);