git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
IB/sa_query: Fix AH leak due to update_sm_ah() race
[pandora-kernel.git]
/
drivers
/
infiniband
/
core
/
sa_query.c
diff --git
a/drivers/infiniband/core/sa_query.c
b/drivers/infiniband/core/sa_query.c
index
1341de7
..
1865049
100644
(file)
--- a/
drivers/infiniband/core/sa_query.c
+++ b/
drivers/infiniband/core/sa_query.c
@@
-395,6
+395,8
@@
static void update_sm_ah(struct work_struct *work)
}
spin_lock_irq(&port->ah_lock);
}
spin_lock_irq(&port->ah_lock);
+ if (port->sm_ah)
+ kref_put(&port->sm_ah->ref, free_sm_ah);
port->sm_ah = new_ah;
spin_unlock_irq(&port->ah_lock);
port->sm_ah = new_ah;
spin_unlock_irq(&port->ah_lock);
@@
-1064,7
+1066,8
@@
static void ib_sa_remove_one(struct ib_device *device)
for (i = 0; i <= sa_dev->end_port - sa_dev->start_port; ++i) {
ib_unregister_mad_agent(sa_dev->port[i].agent);
for (i = 0; i <= sa_dev->end_port - sa_dev->start_port; ++i) {
ib_unregister_mad_agent(sa_dev->port[i].agent);
- kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah);
+ if (sa_dev->port[i].sm_ah)
+ kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah);
}
kfree(sa_dev);
}
kfree(sa_dev);