Considering this case in find_free_channels(): bitmap: +------------------+-+-+-+-+-+-+-+-+-+-+ | ...... |0|0|0|0|0|0|0|1|0|0| +------------------+-+-+-+-+-+-+-+-+-+-+
1. Channel #2 has been occupied, so bit #2 is 1, and the others are all 0. 2. Another thread tries to find 4 free channels from #0. 3. In the 1st loop, pos starts from 0, and then it checks if the following 4 bits are all 0, but fails, as bit#2 is 1. 4. In the 2st loop, pos is not updated, and still starts from 0, so nothing changes against loop #1. 5. Dead loop ... This patch is to update the pos in step #3 to avoid the issue. Fixes: 7bd1d4093c2f ("stm class: Introduce an abstraction for System Trace Module devices") Signed-off-by: Zhi Jin <zhi....@intel.com> --- drivers/hwtracing/stm/core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c index 10bcb5d73f90..c86a979b9bd7 100644 --- a/drivers/hwtracing/stm/core.c +++ b/drivers/hwtracing/stm/core.c @@ -244,6 +244,8 @@ static int find_free_channels(unsigned long *bitmap, unsigned int start, ; if (i == width) return pos; + + pos += i; } return -1; -- 2.7.4