diff options
Diffstat (limited to 'drivers/char/mmtimer.c')
| -rw-r--r-- | drivers/char/mmtimer.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/char/mmtimer.c b/drivers/char/mmtimer.c index 22b9905c1e5..c09160383a5 100644 --- a/drivers/char/mmtimer.c +++ b/drivers/char/mmtimer.c @@ -680,7 +680,7 @@ static int __init mmtimer_init(void)  	if (sn_rtc_cycles_per_second < 100000) {  		printk(KERN_ERR "%s: unable to determine clock frequency\n",  		       MMTIMER_NAME); -		return -1; +		goto out1;  	}  	mmtimer_femtoperiod = ((unsigned long)1E15 + sn_rtc_cycles_per_second / @@ -689,13 +689,13 @@ static int __init mmtimer_init(void)  	if (request_irq(SGI_MMTIMER_VECTOR, mmtimer_interrupt, IRQF_PERCPU, MMTIMER_NAME, NULL)) {  		printk(KERN_WARNING "%s: unable to allocate interrupt.",  			MMTIMER_NAME); -		return -1; +		goto out1;  	}  	if (misc_register(&mmtimer_miscdev)) {  		printk(KERN_ERR "%s: failed to register device\n",  		       MMTIMER_NAME); -		return -1; +		goto out2;  	}  	/* Get max numbered node, calculate slots needed */ @@ -709,16 +709,18 @@ static int __init mmtimer_init(void)  	if (timers == NULL) {  		printk(KERN_ERR "%s: failed to allocate memory for device\n",  				MMTIMER_NAME); -		return -1; +		goto out3;  	} +	memset(timers,0,(sizeof(mmtimer_t *)*maxn)); +  	/* Allocate mmtimer_t's for each online node */  	for_each_online_node(node) {  		timers[node] = kmalloc_node(sizeof(mmtimer_t)*NUM_COMPARATORS, GFP_KERNEL, node);  		if (timers[node] == NULL) {  			printk(KERN_ERR "%s: failed to allocate memory for device\n",  				MMTIMER_NAME); -			return -1; +			goto out4;  		}  		for (i=0; i< NUM_COMPARATORS; i++) {  			mmtimer_t * base = timers[node] + i; @@ -739,6 +741,17 @@ static int __init mmtimer_init(void)  	       sn_rtc_cycles_per_second/(unsigned long)1E6);  	return 0; + +out4: +	for_each_online_node(node) { +		kfree(timers[node]); +	} +out3: +	misc_deregister(&mmtimer_miscdev); +out2: +	free_irq(SGI_MMTIMER_VECTOR, NULL); +out1: +	return -1;  }  module_init(mmtimer_init);  |