qcacld-3.0: Fix free_pool referencing in hdd_lro_desc_find
list_empty api does not work correctly on copied list head.
Need to point to the original free_pool memory so that the
spinlocking and list management apis work as expected on
the original memory.
Change-Id: I631466d156c83f70cb6ea06eec0e361081f294cc
CRs-Fixed: 1070258
diff --git a/core/hdd/src/wlan_hdd_lro.c b/core/hdd/src/wlan_hdd_lro.c
index dde5d9e..857d2c1 100644
--- a/core/hdd/src/wlan_hdd_lro.c
+++ b/core/hdd/src/wlan_hdd_lro.c
@@ -214,7 +214,7 @@
struct hdd_lro_desc_table *lro_hash_table;
struct list_head *ptr;
struct hdd_lro_desc_entry *entry;
- struct hdd_lro_desc_pool free_pool;
+ struct hdd_lro_desc_pool *free_pool;
struct hdd_lro_desc_info *desc_info = &adapter->lro_info.lro_desc_info;
*lro_desc = NULL;
@@ -245,24 +245,19 @@
qdf_spin_unlock_bh(&desc_info->lro_hash_lock);
/* no existing flow found, a new LRO desc needs to be allocated */
- free_pool = adapter->lro_info.lro_desc_info.lro_desc_pool;
- qdf_spin_lock_bh(&free_pool.lro_pool_lock);
+ free_pool = &adapter->lro_info.lro_desc_info.lro_desc_pool;
+ qdf_spin_lock_bh(&free_pool->lro_pool_lock);
entry = list_first_entry_or_null(
- &free_pool.lro_free_list_head,
+ &free_pool->lro_free_list_head,
struct hdd_lro_desc_entry, lro_node);
if (NULL == entry) {
hdd_err("Could not allocate LRO desc!");
- qdf_spin_unlock_bh(&free_pool.lro_pool_lock);
+ qdf_spin_unlock_bh(&free_pool->lro_pool_lock);
return -ENOMEM;
}
- if (list_empty(&entry->lro_node)) {
- hdd_err("Reached max supported lro_desc range\n");
- return -EINVAL;
- }
-
list_del_init(&entry->lro_node);
- qdf_spin_unlock_bh(&free_pool.lro_pool_lock);
+ qdf_spin_unlock_bh(&free_pool->lro_pool_lock);
if (NULL == entry->lro_desc) {
hdd_err("entry->lro_desc is NULL!\n");