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

Commit 5db62557 authored by Anil Kumar Mamidala's avatar Anil Kumar Mamidala Committed by Gerrit - the friendly Code Review server
Browse files

qos: Register irq notify after adding the qos request



Before adding the irq affinity based qos request to the list, if
the affinity of the interrupt changes it will trigger notify call.
This notifier call will try to update the qos request. Accessing
the qos request which is not yet added to the list leads to a
NULL pointer exception.

Avoid this race by registering the notifier after adding the
qos request.

Change-Id: I99869cc233573b5db10e4f3224d65c29511050ea
Signed-off-by: default avatarAnil Kumar Mamidala <amami@codeaurora.org>
parent c67d392d
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -574,9 +574,13 @@ void pm_qos_add_request(struct pm_qos_request *req,
#ifdef CONFIG_SMP
	case PM_QOS_REQ_AFFINE_IRQ:
		if (irq_can_set_affinity(req->irq)) {
			int ret = 0;
			struct irq_desc *desc = irq_to_desc(req->irq);
			struct cpumask *mask = desc->irq_data.common->affinity;
			struct cpumask *mask;

			if (!desc)
				return;

			mask = desc->irq_data.common->affinity;

			/* Get the current affinity */
			cpumask_copy(&req->cpus_affine, mask);
@@ -584,13 +588,6 @@ void pm_qos_add_request(struct pm_qos_request *req,
			req->irq_notify.notify = pm_qos_irq_notify;
			req->irq_notify.release = pm_qos_irq_release;

			ret = irq_set_affinity_notifier(req->irq,
					&req->irq_notify);
			if (ret) {
				WARN(1, "IRQ affinity notify set failed\n");
				req->type = PM_QOS_REQ_ALL_CORES;
				cpumask_setall(&req->cpus_affine);
			}
		} else {
			req->type = PM_QOS_REQ_ALL_CORES;
			cpumask_setall(&req->cpus_affine);
@@ -612,6 +609,24 @@ void pm_qos_add_request(struct pm_qos_request *req,
	trace_pm_qos_add_request(pm_qos_class, value);
	pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints,
			     &req->node, PM_QOS_ADD_REQ, value);

#ifdef CONFIG_SMP
	if (req->type == PM_QOS_REQ_AFFINE_IRQ &&
			irq_can_set_affinity(req->irq)) {
		int ret = 0;

		ret = irq_set_affinity_notifier(req->irq,
					&req->irq_notify);
		if (ret) {
			WARN(1, "IRQ affinity notify set failed\n");
			req->type = PM_QOS_REQ_ALL_CORES;
			cpumask_setall(&req->cpus_affine);
			pm_qos_update_target(
				pm_qos_array[pm_qos_class]->constraints,
				&req->node, PM_QOS_UPDATE_REQ, value);
		}
	}
#endif
}
EXPORT_SYMBOL_GPL(pm_qos_add_request);