On Thu, Sep 12, 2019 at 06:32:04PM -0700, Megha Dey wrote: > +/* > + * Determine if a dev is mdev or not. Return NULL if not mdev device. > + * Return mdev's parent dev if success. > + */ > +static inline struct device *mdev_to_parent(struct device *dev) > +{ > + struct device *ret = NULL; > + struct device *(*fn)(struct device *dev); > + struct bus_type *bus = symbol_get(mdev_bus_type); > + > + if (bus && dev->bus == bus) { > + fn = symbol_get(mdev_dev_to_parent_dev); > + ret = fn(dev); > + symbol_put(mdev_dev_to_parent_dev); > + symbol_put(mdev_bus_type); > + } Yuk, arch code should not have special knowledge about vfio-mdev, and in any case the above way to get it is really gross. > +static struct msi_domain_ops dev_ims_domain_ops = { > + .get_hwirq = msi_get_hwirq, > + .msi_prepare = dev_ims_prepare, > +}; > + > +static struct irq_chip dev_ims_ir_controller = { > + .name = "IR-DEV-IMS", > + .irq_unmask = dev_ims_unmask_irq, > + .irq_mask = dev_ims_mask_irq, > + .irq_ack = irq_chip_ack_parent, > + .irq_retrigger = irq_chip_retrigger_hierarchy, > + .irq_set_vcpu_affinity = irq_chip_set_vcpu_affinity_parent, > + .flags = IRQCHIP_SKIP_SET_WAKE, > + .irq_write_msi_msg = dev_ims_write_msg, > +}; It seems really weird to wrapper an irq_chip like this, if the caller is supposed to provide the functions more or less directly why not have the caller create and own the irq chip? Is something in the way of this? It looked like the platform version of this did the same API approach.. Jason