On Mon, Mar 19, 2018 at 08:37:07AM +0100, Greg KH wrote:
On Mon, Mar 19, 2018 at 03:28:40PM +0800, Ard Biesheuvel wrote:
On 19 March 2018 at 15:27, Ard Biesheuvel ard.biesheuvel@linaro.org wrote:
Commit 4f2c7583e33e upstream.
When struct its_device instances are created, the nr_ites member will be set to a power of 2 that equals or exceeds the requested number of MSIs passed to the msi_prepare() callback. At the same time, the LPI map is allocated to be some multiple of 32 in size, where the allocated size may be less than the requested size depending on whether a contiguous range of sufficient size is available in the global LPI bitmap.
This may result in the situation where the nr_ites < nr_lpis, and since nr_ites is what we program into the hardware when we map the device, the additional LPIs will be non-functional.
For bog standard hardware, this does not really matter. However, in cases where ITS device IDs are shared between different PCIe devices, we may end up allocating these additional LPIs without taking into account that they don't actually work.
So let's make nr_ites at least 32. This ensures that all allocated LPIs are 'live', and that its_alloc_device_irq() will fail when attempts are made to allocate MSIs beyond what was allocated in the first place.
Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org [maz: updated comment] Signed-off-by: Marc Zyngier marc.zyngier@arm.com [ardb: trivial tweak of unrelated context] Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Please apply to v4.9
What about 4.14.y and 4.15.y? Why only add it to one really old tree, you don't want people updating to a newer kernel and have a regression, right?
Ah, now I see your other email, sorry, nevermind...