mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 22:23:14 -04:00
qcacmn: Correct peer create-delete sequence
If peer with given MAC Address already exists, just increment the refcnt instead of allocating a new peer and deleting older peer object. This avoids unnecessary memory fragmentation. Change-Id: I76a3ffca4e907fccfdfd1b6857de721623f455d5 CRs-Fixed: 2209045
This commit is contained in:
parent
cf526b7b9f
commit
0323f80221
3 changed files with 18 additions and 17 deletions
|
|
@ -335,6 +335,9 @@ extern void dp_rx_discard(struct dp_vdev *vdev, struct dp_peer *peer,
|
|||
unsigned tid, qdf_nbuf_t msdu_list);
|
||||
extern void *dp_find_peer_by_addr(struct cdp_pdev *dev,
|
||||
uint8_t *peer_mac_addr, uint8_t *peer_id);
|
||||
extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
|
||||
uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id);
|
||||
|
||||
#ifndef CONFIG_WIN
|
||||
QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle,
|
||||
struct ol_txrx_desc_type *sta_desc);
|
||||
|
|
|
|||
|
|
@ -3388,6 +3388,15 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
|
|||
|
||||
pdev = vdev->pdev;
|
||||
soc = pdev->soc;
|
||||
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr,
|
||||
0, vdev->vdev_id);
|
||||
|
||||
if (peer) {
|
||||
peer->delete_in_progress = false;
|
||||
return (void *)peer;
|
||||
}
|
||||
|
||||
#ifdef notyet
|
||||
peer = (struct dp_peer *)qdf_mempool_alloc(soc->osdev,
|
||||
soc->mempool_ol_ath_peer);
|
||||
|
|
@ -4081,6 +4090,7 @@ static void dp_peer_delete_wifi3(void *peer_handle, uint32_t bitmap)
|
|||
/* redirect the peer's rx delivery function to point to a
|
||||
* discard func
|
||||
*/
|
||||
|
||||
peer->rx_opt_proc = dp_rx_discard;
|
||||
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
|
|
|
|||
|
|
@ -682,13 +682,8 @@ uint8_t dp_peer_ast_get_next_hop(struct dp_soc *soc,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if ATH_SUPPORT_WRAP
|
||||
static struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
|
||||
struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
|
||||
uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id)
|
||||
#else
|
||||
static struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
|
||||
uint8_t *peer_mac_addr, int mac_addr_is_aligned)
|
||||
#endif
|
||||
{
|
||||
union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
|
||||
unsigned index;
|
||||
|
|
@ -899,12 +894,8 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
|
|||
|
||||
QDF_ASSERT(peer_id <= wlan_cfg_max_peer_id(soc->wlan_cfg_ctx) + 1);
|
||||
/* check if there's already a peer object with this MAC address */
|
||||
#if ATH_SUPPORT_WRAP
|
||||
peer = dp_peer_find_hash_find(soc, peer_mac_addr,
|
||||
0 /* is aligned */, vdev_id);
|
||||
#else
|
||||
peer = dp_peer_find_hash_find(soc, peer_mac_addr, 0 /* is aligned */);
|
||||
#endif
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
"%s: peer %pK ID %d vid %d mac %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
__func__, peer, peer_id, vdev_id, peer_mac_addr[0],
|
||||
|
|
@ -1081,12 +1072,8 @@ void *dp_find_peer_by_addr(struct cdp_pdev *dev, uint8_t *peer_mac_addr,
|
|||
struct dp_pdev *pdev = (struct dp_pdev *)dev;
|
||||
struct dp_peer *peer;
|
||||
|
||||
#if ATH_SUPPORT_WRAP
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0, 0);
|
||||
/* WAR, VDEV ID? TEMP 0 */
|
||||
#else
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0);
|
||||
#endif
|
||||
|
||||
if (!peer)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -1974,7 +1961,7 @@ void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
|
|||
struct dp_peer *peer;
|
||||
|
||||
DP_TRACE(INFO, "vdev %pK peer_addr %pK", vdev, peer_addr);
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_addr, 0);
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_addr, 0, 0);
|
||||
DP_TRACE(INFO, "peer %pK vdev %pK", peer, vdev);
|
||||
|
||||
if (!peer)
|
||||
|
|
@ -2045,7 +2032,7 @@ QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac,
|
|||
struct dp_peer *peer;
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
||||
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac, 0);
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac, 0, 0);
|
||||
if (NULL == peer) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
"Failed to find peer for: [%pM]", peer_mac);
|
||||
|
|
@ -2368,3 +2355,4 @@ void dp_peer_rxtid_stats(struct dp_peer *peer, void (*dp_stats_cmd_cb),
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue