Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cbe11a6 authored by Jianmin Zhu's avatar Jianmin Zhu Committed by Gerrit - the friendly Code Review server
Browse files

qcacmn: channel_switch_complete_evt need wake up all waiting threads

2 threads blocked to wait channel_switch_complete_evt for SAP channel
switch is already in progress,  qdf_event_set only woke up 1st thread
later,  2nd  thread still kept blocked with hold  net_dev for debug id
NET_DEV_HOLD_COUNTRY_CHANGE_UPDATE_SAP, leak happened.

Change-Id: Ib76318dd4a613ca1852a56b7701a04385b69ba56
CRs-Fixed: 3061976
parent 518cd074
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2018 The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2018, 2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -41,8 +41,36 @@ typedef __qdf_event_t qdf_event_t;

QDF_STATUS qdf_event_create(qdf_event_t *event);

/**
 * qdf_event_set() - sets a QDF event for single waiting threads
 * @event: The event to set to the signalled state
 *
 * The state of the specified event is set to signalled by calling
 * qdf_event_set().
 *
 * Single thread waiting on the event as a result of a qdf_event_wait() will
 * be unblocked and available to be scheduled for execution when the event
 * is signaled by a call to qdf_event_set().
 *
 * Return: QDF status
 */
QDF_STATUS qdf_event_set(qdf_event_t *event);

/**
 * qdf_event_set_all() - sets a QDF event for all waiting threads
 * @event: The event to set to the signalled state
 *
 * The state of the specified event is set to signalled by calling
 * qdf_event_set_all().
 *
 * Any threads waiting on the event as a result of a qdf_event_wait() will
 * be unblocked and available to be scheduled for execution when the event
 * is signaled by a call to qdf_event_set().
 *
 * Return: QDF status
 */
QDF_STATUS qdf_event_set_all(qdf_event_t *event);

QDF_STATUS qdf_event_reset(qdf_event_t *event);

QDF_STATUS qdf_event_destroy(qdf_event_t *event);
+20 −13
Original line number Diff line number Diff line
@@ -77,19 +77,6 @@ QDF_STATUS qdf_event_create(qdf_event_t *event)
}
qdf_export_symbol(qdf_event_create);

/**
 * qdf_event_set() - sets a QDF event
 * @event: The event to set to the signalled state
 *
 * The state of the specified event is set to signalled by calling
 * qdf_event_set().
 *
 * Any threads waiting on the event as a result of a qdf_event_wait() will
 * be unblocked and available to be scheduled for execution when the event
 * is signaled by a call to qdf_event_set().
 *
 * Return: QDF status
 */
QDF_STATUS qdf_event_set(qdf_event_t *event)
{
	QDF_BUG(event);
@@ -106,8 +93,28 @@ QDF_STATUS qdf_event_set(qdf_event_t *event)

	return QDF_STATUS_SUCCESS;
}

qdf_export_symbol(qdf_event_set);

QDF_STATUS qdf_event_set_all(qdf_event_t *event)
{
	QDF_BUG(event);
	if (!event)
		return QDF_STATUS_E_FAULT;

	/* ensure event is initialized */
	QDF_BUG(event->cookie == LINUX_EVENT_COOKIE);
	if (event->cookie != LINUX_EVENT_COOKIE)
		return QDF_STATUS_E_INVAL;

	event->done = true;
	complete_all(&event->complete);

	return QDF_STATUS_SUCCESS;
}

qdf_export_symbol(qdf_event_set_all);

/**
 * qdf_event_reset() - resets a QDF event
 * @event: The event to set to the NOT signalled state