[PATCH v2] drm/amdkfd: Try to schedule bottom half on same core
Felix Kuehling
felix.kuehling at amd.com
Fri Aug 12 18:10:58 UTC 2022
On 2022-08-12 09:55, Philip Yang wrote:
>
> On 2022-08-11 15:04, Felix Kuehling wrote:
>> On systems that support SMT (hyperthreading) schedule the bottom half of
>> the KFD interrupt handler on the same core. This makes it possible to
>> reserve a core for interrupt handling and have the bottom half run on
>> that same core.
>>
>> On systems without SMT, pick another core in the same NUMA node, as
>> before.
>>
>> Use for_each_cpu_wrap instead of open-coding it.
>>
>> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
>
> nit-pick below, looks better to use new_cpu as iterator, either way
> this is
>
> Reviewed-by: Philip Yang <Philip.Yang at amd.com>
Thank you. I think I prefer cpu as the iterator and new_cpu as the
variable that holds the CPU we choose to schedule to.
Regards,
Felix
>
>> ---
>> drivers/gpu/drm/amd/amdkfd/kfd_device.c | 20 ++++++++++++++++----
>> 1 file changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> index f5853835f03a..4d1284714e7a 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
>> @@ -24,6 +24,7 @@
>> #include <linux/bsearch.h>
>> #include <linux/pci.h>
>> #include <linux/slab.h>
>> +#include <linux/topology.h>
>> #include "kfd_priv.h"
>> #include "kfd_device_queue_manager.h"
>> #include "kfd_pm4_headers_vi.h"
>> @@ -801,13 +802,24 @@ static inline void kfd_queue_work(struct
>> workqueue_struct *wq,
>> struct work_struct *work)
>> {
>> int cpu, new_cpu;
>> + const struct cpumask *mask = NULL;
>> cpu = new_cpu = smp_processor_id();
>> - do {
>> - new_cpu = cpumask_next(new_cpu, cpu_online_mask) % nr_cpu_ids;
>> - if (cpu_to_node(new_cpu) == numa_node_id())
>> +
>> +#if defined(CONFIG_SCHED_SMT)
>> + /* CPU threads in the same core */
>> + mask = cpu_smt_mask(cpu);
>> +#endif
>> + if (!mask || cpumask_weight(mask) <= 1)
>> + /* CPU threads in the same NUMA node */
>> + mask = cpu_cpu_mask(cpu);
>> + /* Pick the next online CPU thread in the same core or NUMA node */
>> + for_each_cpu_wrap(cpu, mask, cpu+1) {
>> + if (cpu != new_cpu && cpu_online(cpu)) {
>> + new_cpu = cpu;
>> break;
>> - } while (cpu != new_cpu);
>> + }
>> + }
>> queue_work_on(new_cpu, wq, work);
>> }
>
> for_each_cpu_wrap(new_cpu, mask, cpu + 1) {
> if (cpu != new_cpu && cpu_online(new_cpu)) {
> cpu = new_cpu;
> break;
> }
> }
> queue_work_on(cpu, wq, work);
>
More information about the amd-gfx
mailing list