Re: [PATCH v1 04/10] powerpc/kernel/iommu: Add new iommu_table_in_use() helper
From: Leonardo Bras <hidden>
Date: 2020-08-27 18:35:06
Also in:
lkml
On Sat, 2020-08-22 at 20:34 +1000, Alexey Kardashevskiy wrote:
quoted
+ + /*ignore reserved bit0*/s/ignore reserved bit0/ ignore reserved bit0 / (add spaces)
Fixed
quoted
+ if (tbl->it_offset == 0) + p1_start = 1; + + /* Check if reserved memory is valid*/A missing space here.
Fixed
quoted
+ if (tbl->it_reserved_start >= tbl->it_offset && + tbl->it_reserved_start <= (tbl->it_offset + tbl->it_size) && + tbl->it_reserved_end >= tbl->it_offset && + tbl->it_reserved_end <= (tbl->it_offset + tbl->it_size)) {Uff. What if tbl->it_reserved_end is bigger than tbl->it_offset + tbl->it_size? The reserved area is to preserve MMIO32 so it is for it_offset==0 only and the boundaries are checked in the only callsite, and it is unlikely to change soon or ever. Rather that bothering with fixing that, may be just add (did not test): if (WARN_ON(( (tbl->it_reserved_start || tbl->it_reserved_end) && (it_offset != 0)) (tbl->it_reserved_start > it_offset && tbl->it_reserved_end < it_offset + it_size) && (it_offset == 0)) ) return true; Or simply always look for it_offset..it_reserved_start and it_reserved_end..it_offset+it_size and if there is no reserved area, initialize it_reserved_start=it_reserved_end=it_offset so the first it_offset..it_reserved_start becomes a no-op.
The problem here is that the values of it_reserved_{start,end} are not
necessarily valid. I mean, on iommu_table_reserve_pages() the values
are stored however they are given (bit reserving is done only if they
are valid).
Having a it_reserved_{start,end} value outside the valid ranges would
cause find_next_bit() to run over memory outside the bitmap.
Even if the those values are < tbl->it_offset, the resulting
subtraction on unsigned would cause it to become a big value and run
over memory outside the bitmap.
But I think you are right. That is not the place to check if the
reserved values are valid. It should just trust them here.
I intent to change iommu_table_reserve_pages() to only store the
parameters in it_reserved_{start,end} if they are in the range, and or
it_offset in both of them if they are not.
What do you think?
Thanks for the feedback!
Leonardo Bras