qcacmn: Perform napi state comparison before releasing napi lock
Release napi spinlock only after performing napi state comparison to avoid any race condition. Change-Id: Icd7b713e474a818dfc6d0fa402496bbe06a3af66 CRs-Fixed: 2078294
This commit is contained in:

committed by
snandini

parent
fc77960e38
commit
0efe289db5
@@ -410,6 +410,7 @@ int hif_napi_event(struct hif_opaque_softc *hif_ctx, enum qca_napi_event event,
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
uint32_t prev_state;
|
uint32_t prev_state;
|
||||||
int i;
|
int i;
|
||||||
|
bool state_changed;
|
||||||
struct napi_struct *napi;
|
struct napi_struct *napi;
|
||||||
struct hif_softc *hif = HIF_GET_SOFTC(hif_ctx);
|
struct hif_softc *hif = HIF_GET_SOFTC(hif_ctx);
|
||||||
struct qca_napi_data *napid = &(hif->napi_data);
|
struct qca_napi_data *napid = &(hif->napi_data);
|
||||||
@@ -559,9 +560,18 @@ int hif_napi_event(struct hif_opaque_softc *hif_ctx, enum qca_napi_event event,
|
|||||||
break;
|
break;
|
||||||
} /* switch blacklist_pending */
|
} /* switch blacklist_pending */
|
||||||
|
|
||||||
|
/* we want to perform the comparison in lock:
|
||||||
|
* there is a possiblity of hif_napi_event get called
|
||||||
|
* from two different contexts (driver unload and cpu hotplug
|
||||||
|
* notification) and napid->state get changed
|
||||||
|
* in driver unload context and can lead to race condition
|
||||||
|
* in cpu hotplug context. Therefore, perform the napid->state
|
||||||
|
* comparison before releasing lock.
|
||||||
|
*/
|
||||||
|
state_changed = (prev_state != napid->state);
|
||||||
qdf_spin_unlock_bh(&(napid->lock));
|
qdf_spin_unlock_bh(&(napid->lock));
|
||||||
|
|
||||||
if (prev_state != napid->state) {
|
if (state_changed) {
|
||||||
if (napid->state == ENABLE_NAPI_MASK) {
|
if (napid->state == ENABLE_NAPI_MASK) {
|
||||||
rc = 1;
|
rc = 1;
|
||||||
for (i = 0; i < CE_COUNT_MAX; i++) {
|
for (i = 0; i < CE_COUNT_MAX; i++) {
|
||||||
|
Reference in New Issue
Block a user