aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen/evtchn.c
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2009-09-18 19:36:58 -0400
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2009-09-18 20:13:17 -0400
commit93afe0b75ef3675ca05320919a57de8b9bbb159c (patch)
tree7b2e5eb82d4f8e7c836a21a1aaf1aa2c0342488b /drivers/xen/evtchn.c
parente3cc067b0a79d3a3672bfe7cfba12f2e8ae56039 (diff)
xen/evtchn: dynamically allocate port_user array
We only need the array when running as a Xen domain, so dynamically allocate it as needed to save on bss space. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Diffstat (limited to 'drivers/xen/evtchn.c')
-rw-r--r--drivers/xen/evtchn.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index 4356a9a030df..709c32d949bf 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -73,7 +73,7 @@ struct per_user_data {
73 * Who's bound to each port? This is logically an array of struct 73 * Who's bound to each port? This is logically an array of struct
74 * per_user_data *, but we encode the current enabled-state in bit 0. 74 * per_user_data *, but we encode the current enabled-state in bit 0.
75 */ 75 */
76static unsigned long port_user[NR_EVENT_CHANNELS]; 76static unsigned long *port_user;
77static DEFINE_SPINLOCK(port_user_lock); /* protects port_user[] and ring_prod */ 77static DEFINE_SPINLOCK(port_user_lock); /* protects port_user[] and ring_prod */
78 78
79static inline struct per_user_data *get_port_user(unsigned port) 79static inline struct per_user_data *get_port_user(unsigned port)
@@ -522,8 +522,11 @@ static int __init evtchn_init(void)
522 if (!xen_domain()) 522 if (!xen_domain())
523 return -ENODEV; 523 return -ENODEV;
524 524
525 port_user = kcalloc(NR_EVENT_CHANNELS, sizeof(*port_user), GFP_KERNEL);
526 if (port_user == NULL)
527 return -ENOMEM;
528
525 spin_lock_init(&port_user_lock); 529 spin_lock_init(&port_user_lock);
526 memset(port_user, 0, sizeof(port_user));
527 530
528 /* Create '/dev/misc/evtchn'. */ 531 /* Create '/dev/misc/evtchn'. */
529 err = misc_register(&evtchn_miscdev); 532 err = misc_register(&evtchn_miscdev);
@@ -539,6 +542,9 @@ static int __init evtchn_init(void)
539 542
540static void __exit evtchn_cleanup(void) 543static void __exit evtchn_cleanup(void)
541{ 544{
545 kfree(port_user);
546 port_user = NULL;
547
542 misc_deregister(&evtchn_miscdev); 548 misc_deregister(&evtchn_miscdev);
543} 549}
544 550