summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2009-09-19 03:36:58 +0400
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2009-09-19 04:13:17 +0400
commit93afe0b75ef3675ca05320919a57de8b9bbb159c (patch)
tree7b2e5eb82d4f8e7c836a21a1aaf1aa2c0342488b
parente3cc067b0a79d3a3672bfe7cfba12f2e8ae56039 (diff)
downloadlinux-93afe0b75ef3675ca05320919a57de8b9bbb159c.tar.xz
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.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 {
* Who's bound to each port? This is logically an array of struct
* per_user_data *, but we encode the current enabled-state in bit 0.
*/
-static unsigned long port_user[NR_EVENT_CHANNELS];
+static unsigned long *port_user;
static DEFINE_SPINLOCK(port_user_lock); /* protects port_user[] and ring_prod */
static inline struct per_user_data *get_port_user(unsigned port)
@@ -522,8 +522,11 @@ static int __init evtchn_init(void)
if (!xen_domain())
return -ENODEV;
+ port_user = kcalloc(NR_EVENT_CHANNELS, sizeof(*port_user), GFP_KERNEL);
+ if (port_user == NULL)
+ return -ENOMEM;
+
spin_lock_init(&port_user_lock);
- memset(port_user, 0, sizeof(port_user));
/* Create '/dev/misc/evtchn'. */
err = misc_register(&evtchn_miscdev);
@@ -539,6 +542,9 @@ static int __init evtchn_init(void)
static void __exit evtchn_cleanup(void)
{
+ kfree(port_user);
+ port_user = NULL;
+
misc_deregister(&evtchn_miscdev);
}