diff options
author | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2009-09-18 19:36:58 -0400 |
---|---|---|
committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2009-09-18 20:13:17 -0400 |
commit | 93afe0b75ef3675ca05320919a57de8b9bbb159c (patch) | |
tree | 7b2e5eb82d4f8e7c836a21a1aaf1aa2c0342488b | |
parent | e3cc067b0a79d3a3672bfe7cfba12f2e8ae56039 (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>
-rw-r--r-- | drivers/xen/evtchn.c | 10 |
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 | */ |
76 | static unsigned long port_user[NR_EVENT_CHANNELS]; | 76 | static unsigned long *port_user; |
77 | static DEFINE_SPINLOCK(port_user_lock); /* protects port_user[] and ring_prod */ | 77 | static DEFINE_SPINLOCK(port_user_lock); /* protects port_user[] and ring_prod */ |
78 | 78 | ||
79 | static inline struct per_user_data *get_port_user(unsigned port) | 79 | static 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 | ||
540 | static void __exit evtchn_cleanup(void) | 543 | static 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 | ||