Messages in this thread | | | Subject | Is iommu_num_pages() broken ? | From | Benjamin Herrenschmidt <> | Date | Sun, 05 Aug 2012 10:16:56 +1000 |
| |
Hi folks !
I stumbled upon this today:
static inline unsigned long iommu_num_pages(unsigned long addr, unsigned long len, unsigned long io_page_size) { unsigned long size = (addr & (io_page_size - 1)) + len;
return DIV_ROUND_UP(size, io_page_size); }
That doesn't look right to me...
The powerpc iommu code at least uses that with an addr which may not be page aligned (ie, result of sg_virt() which include the offset).
The above code will align the start before adding the len which is wrong and will result in potentially missing a page or am I missing something ?
Shouldn't it be something like
static inline unsigned long iommu_num_pages(unsigned long addr, unsigned long len, unsigned long io_page_size) { unsigned long start = addr & (io_page_size - 1); unsigned long end = addr + len;
return DIV_ROUND_UP(end - start, io_page_size); }
?
Cheers, Ben.
| |