[RFC PATCH kernel] vfio/spapr_tce: Get rid of possible infinite loop
Michael Ellerman
mpe at ellerman.id.au
Mon Oct 8 21:18:27 AEDT 2018
Serhii Popovych <spopovyc at redhat.com> writes:
> Alexey Kardashevskiy wrote:
>> As a part of cleanup, the SPAPR TCE IOMMU subdriver releases preregistered
>> memory. If there is a bug in memory release, the loop in
>> tce_iommu_release() becomes infinite; this actually happened to me.
>>
>> This makes the loop finite and prints a warning on every failure to make
>> the code more bug prone.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
>> ---
>> drivers/vfio/vfio_iommu_spapr_tce.c | 10 +++-------
>> 1 file changed, 3 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c
>> index b1a8ab3..ece0651 100644
>> --- a/drivers/vfio/vfio_iommu_spapr_tce.c
>> +++ b/drivers/vfio/vfio_iommu_spapr_tce.c
>> @@ -393,13 +394,8 @@ static void tce_iommu_release(void *iommu_data)
>> tce_iommu_free_table(container, tbl);
>> }
>>
>> - while (!list_empty(&container->prereg_list)) {
>> - struct tce_iommu_prereg *tcemem;
>> -
>> - tcemem = list_first_entry(&container->prereg_list,
>> - struct tce_iommu_prereg, next);
>> - WARN_ON_ONCE(tce_iommu_prereg_free(container, tcemem));
>> - }
>> + list_for_each_entry_safe(tcemem, tmtmp, &container->prereg_list, next)
>> + WARN_ON(tce_iommu_prereg_free(container, tcemem));
>
> I'm not sure that tce_iommu_prereg_free() call under WARN_ON() is good
> idea because WARN_ON() is a preprocessor macro:
>
> if CONFIG_WARN=n is added by the analogy with CONFIG_BUG=n defining
> WARN_ON() as empty we will loose call to tce_iommu_prereg_free()
> leaking resources.
I don't think that's likely to ever happen though, we have a large
number of uses that would need to be checked one-by-one:
$ git grep "if (WARN_ON(" | wc -l
2853
So if we ever did add CONFIG_WARN, I think it would still need to
evaluate the condition, just not emit a warning.
cheers
More information about the Linuxppc-dev
mailing list