On 03/06/20 13:45, Benjamin Gaignard wrote: > +static void dcmi_set_min_frequency(struct stm32_dcmi *dcmi, u64 freq) > +{ > + struct cpufreq_policy *p; > + int cpu; > + > + for_each_cpu(cpu, irq_get_affinity_mask(dcmi->irq)) { > + p = per_cpu(policy, cpu); > + if (!p) > + continue; > + > + freq_qos_update_request(&per_cpu(qos_req, cpu), freq); > + } > +} > + You may want to use a "visited" cpumask as I suggested in the previous thread, since a policy can cover more than one CPU (IOW, a frequency domain can span more than one CPU). It's not required per-se, AFAICT, but it makes things a bit neater. I also think you'll have to use the affinity notifier (irq_set_affinity_notifier()), since AFAICT userspace can change the affinity of that IRQ. I suppose you'll want something like: - Check if we currently are in streaming mode - Clear the QoS request for CPUs that were previously boosted but that aren't in the new mask - Add the request for the new CPUs. You'll probably need serialize the reading of the mask in the regular dcmi_set_min_frequency() as well. I concur all of that is somewhat annoying, but AFAICT that's required for a sturdy implementation. > static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) > { > struct stm32_dcmi *dcmi = vb2_get_drv_priv(vq);