Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752664Ab1BOQUz (ORCPT ); Tue, 15 Feb 2011 11:20:55 -0500 Received: from cantor.suse.de ([195.135.220.2]:47627 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751140Ab1BOQUy (ORCPT ); Tue, 15 Feb 2011 11:20:54 -0500 Date: Tue, 15 Feb 2011 07:59:54 -0800 From: Greg KH To: "K. Y. Srinivasan" Cc: linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, virtualization@lists.osdl.org, Haiyang Zhang , Hank Janssen Subject: Re: [PATCH ]:Staging: hv: Allocate the vmbus irq dynamically Message-ID: <20110215155954.GA32313@suse.de> References: <1297782937-24082-1-git-send-email-kys@microsoft.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1297782937-24082-1-git-send-email-kys@microsoft.com> User-Agent: Mutt/1.5.20 (2009-06-14) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3809 Lines: 126 On Tue, Feb 15, 2011 at 07:15:37AM -0800, K. Y. Srinivasan wrote: > > Signed-off-by: K. Y. Srinivasan > Signed-off-by: Haiyang Zhang > Signed-off-by: Hank Janssen > > --- > drivers/staging/hv/vmbus_drv.c | 49 +++++++++++++++++++++++++++------------ > 1 files changed, 34 insertions(+), 15 deletions(-) > > diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c > index 459c707..f279e6a 100644 > --- a/drivers/staging/hv/vmbus_drv.c > +++ b/drivers/staging/hv/vmbus_drv.c > @@ -36,9 +36,7 @@ > #include "vmbus_private.h" > > > -/* FIXME! We need to do this dynamically for PIC and APIC system */ > -#define VMBUS_IRQ 0x5 > -#define VMBUS_IRQ_VECTOR IRQ5_VECTOR > +static int vmbus_irq; > > /* Main vmbus driver data structure */ > struct vmbus_driver_context { > @@ -57,6 +55,25 @@ struct vmbus_driver_context { > struct vm_device device_ctx; > }; > > +/* > + * Find an un-used IRQ that the VMBUS can use. If none is available; return -1. > + */ > + > +static int vmbus_get_irq(void) No extra blank line between function comment and function. > +{ > + unsigned int avail_irq_mask; > + int irq = -1; > + /* Put an extra blank line after your variables please. > + * Pick the first unused interrupt. HyperV can > + * interrupt us on any interrupt line we specify. > + */ > + avail_irq_mask = probe_irq_on(); > + if (avail_irq_mask != 0) > + irq = ffs(avail_irq_mask); > + probe_irq_off(avail_irq_mask); > + return irq; > +} > + > static int vmbus_match(struct device *device, struct device_driver *driver); > static int vmbus_probe(struct device *device); > static int vmbus_remove(struct device *device); > @@ -80,7 +97,6 @@ EXPORT_SYMBOL(vmbus_loglevel); > /* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */ > /* (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT); */ > > -static int vmbus_irq = VMBUS_IRQ; > > /* Set up per device attributes in /sys/bus/vmbus/devices/ */ > static struct device_attribute vmbus_device_attrs[] = { > @@ -466,7 +482,7 @@ static int vmbus_bus_init(void) > struct hv_driver *driver = &vmbus_drv.drv_obj; > struct vm_device *dev_ctx = &vmbus_drv.device_ctx; > int ret; > - unsigned int vector; > + unsigned int vector, prev_irq = ~0; > > DPRINT_INFO(VMBUS, "+++++++ HV Driver version = %s +++++++", > HV_DRV_VERSION); > @@ -518,19 +534,23 @@ static int vmbus_bus_init(void) > } > > /* Get the interrupt resource */ > - ret = request_irq(vmbus_irq, vmbus_isr, IRQF_SAMPLE_RANDOM, > - driver->name, NULL); > - > - if (ret != 0) { > - DPRINT_ERR(VMBUS_DRV, "ERROR - Unable to request IRQ %d", > - vmbus_irq); > - > +get_irq_again: > + vmbus_irq = vmbus_get_irq(); > + if ((vmbus_irq < 0) || (prev_irq == vmbus_irq)) { > + printk(KERN_WARNING "VMBUS_DRV: Failed to allocate IRQ\n"); > bus_unregister(&vmbus_drv_ctx->bus); > - > ret = -1; Please provide a "real" error code. > goto cleanup; > } > - vector = VMBUS_IRQ_VECTOR; > + prev_irq = vmbus_irq; > + > + ret = request_irq(vmbus_irq, vmbus_isr, IRQF_SAMPLE_RANDOM, > + driver->name, NULL); > + > + if (ret != 0) > + goto get_irq_again; You just set up the potential for an endless loop. You almost _never_ want to goto backwards in a function. Please don't do this. > + > + vector = IRQ0_VECTOR + vmbus_irq; What's this for? > DPRINT_INFO(VMBUS_DRV, "irq 0x%x vector 0x%x", vmbus_irq, vector); And why are you still printing this out for the whole world to see? thanks, greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/