Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb5e1d86 authored by Jingxiang Ge's avatar Jingxiang Ge
Browse files

qcacmn: check wrap around in BEFORE_UNLOCK

1 Add protection for wrap around of jiffies.
2 fix assign issue from uint32_t to uint64_t.

Change-Id: Idbd3604d0cb985d08aa82e3b1d7f32fa6be8c3ef
CRs-Fixed: 2864737
parent 4d1f0f6f
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -138,8 +138,15 @@ do { \
/* max_hold_time in US */
#define BEFORE_UNLOCK(lock, max_hold_time) \
do {\
	uint64_t held_time = qdf_get_log_timestamp_lightweight() - \
		lock->stats.last_acquired; \
	uint64_t BEFORE_UNLOCK_time;  \
	uint64_t held_time;  \
	BEFORE_UNLOCK_time = qdf_get_log_timestamp_lightweight(); \
\
	if (unlikely(BEFORE_UNLOCK_time < lock->stats.last_acquired)) \
		held_time = 0; \
	else \
		held_time = BEFORE_UNLOCK_time - lock->stats.last_acquired; \
\
	lock->stats.held_time += held_time; \
\
	if (held_time > lock->stats.max_held_time) \
+9 −1
Original line number Diff line number Diff line
@@ -299,7 +299,15 @@ static inline uint64_t qdf_get_log_timestamp_lightweight(void)
{
	uint64_t timestamp_us;

	timestamp_us = __qdf_system_ticks_to_msecs(qdf_system_ticks()) * 1000;
	/* explicitly change to uint64_t, otherwise it will assign
	 * uint32_t to timestamp_us, which lose high 32bits.
	 * on 64bit platform, it will only use low 32bits jiffies in
	 * jiffies_to_msecs.
	 * eg: HZ=250, it will overflow every (0xffff ffff<<2==0x3fff ffff)
	 * ticks. it is 1193 hours.
	 */
	timestamp_us =
	(uint64_t)__qdf_system_ticks_to_msecs(qdf_system_ticks()) * 1000;
	return timestamp_us;
}
#endif /* end of MSM_PLATFORM */