[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] netfront accel: Over-eager locking meant kmalloc at GFP_KERNEL with irqs disabled
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1198169894 0 # Node ID 61c96456a3e10847b6281e9f9fe819ae513a1658 # Parent 06b826b4f71e74f016767aa2f26232239839bee3 netfront accel: Over-eager locking meant kmalloc at GFP_KERNEL with irqs disabled Signed-off-by Kieran Mansley <kmansley@xxxxxxxxxxxxxx> --- drivers/xen/netfront/accel.c | 19 +++---------------- 1 files changed, 3 insertions(+), 16 deletions(-) diff -r 06b826b4f71e -r 61c96456a3e1 drivers/xen/netfront/accel.c --- a/drivers/xen/netfront/accel.c Thu Dec 20 11:05:16 2007 +0000 +++ b/drivers/xen/netfront/accel.c Thu Dec 20 16:58:14 2007 +0000 @@ -273,6 +273,7 @@ static int init_accelerator(const char * { struct netfront_accelerator *accelerator = kmalloc(sizeof(struct netfront_accelerator), GFP_KERNEL); + unsigned long flags; int frontend_len; if (!accelerator) { @@ -294,7 +295,9 @@ static int init_accelerator(const char * accelerator->hooks = hooks; + spin_lock_irqsave(&accelerators_lock, flags); list_add(&accelerator->link, &accelerators_list); + spin_unlock_irqrestore(&accelerators_lock, flags); *result = accelerator; @@ -365,11 +368,8 @@ static int netfront_load_accelerator(str { struct netfront_accelerator *accelerator; int rc = 0; - unsigned long flags; DPRINTK(" %s\n", frontend); - - spin_lock_irqsave(&accelerators_lock, flags); /* * Look at list of loaded accelerators to see if the requested @@ -377,8 +377,6 @@ static int netfront_load_accelerator(str */ list_for_each_entry(accelerator, &accelerators_list, link) { if (match_accelerator(frontend, accelerator)) { - spin_unlock_irqrestore(&accelerators_lock, flags); - accelerator_probe_new_vif(np, dev, accelerator); return 0; } @@ -386,11 +384,8 @@ static int netfront_load_accelerator(str /* Couldn't find it, so create a new one and load the module */ if ((rc = init_accelerator(frontend, &accelerator, NULL)) < 0) { - spin_unlock_irqrestore(&accelerators_lock, flags); return rc; } - - spin_unlock_irqrestore(&accelerators_lock, flags); /* Include this frontend device on the accelerator's list */ add_accelerator_vif(accelerator, np); @@ -450,7 +445,6 @@ int netfront_accelerator_loaded(int vers struct netfront_accel_hooks *hooks) { struct netfront_accelerator *accelerator; - unsigned long flags; if (version != NETFRONT_ACCEL_VERSION) { if (version > NETFRONT_ACCEL_VERSION) { @@ -469,18 +463,13 @@ int netfront_accelerator_loaded(int vers mutex_lock(&accelerator_mutex); - spin_lock_irqsave(&accelerators_lock, flags); - /* * Look through list of accelerators to see if it has already * been requested */ list_for_each_entry(accelerator, &accelerators_list, link) { if (match_accelerator(frontend, accelerator)) { - spin_unlock_irqrestore(&accelerators_lock, flags); - accelerator_probe_vifs(accelerator, hooks); - goto out; } } @@ -493,8 +482,6 @@ int netfront_accelerator_loaded(int vers frontend); init_accelerator(frontend, &accelerator, hooks); - - spin_unlock_irqrestore(&accelerators_lock, flags); out: mutex_unlock(&accelerator_mutex); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |