소스 검색

qcacmn: Fix to release lock correctly in DP_PRINT_STATS

Currently, sysfs_write_user_buffer spinlock is not
released correctly in DP_PRINT_STATS() when the
buffer size reaches max value. This is causing a
soft lockup, when the next DP_PRINT_STATS() call
is waiting to acquire the spinlock.
This change prevents the softlockup by properly
handling the release of the spinlock.

Change-Id: I13c3e26f7a26b501c5d23b8dc4b978f61beeabd0
CRs-Fixed: 3495547
Namita Nair 2 년 전
부모
커밋
ce47d03e6b
1개의 변경된 파일8개의 추가작업 그리고 2개의 파일을 삭제
  1. 8 2
      dp/wifi3.0/dp_stats.c

+ 8 - 2
dp/wifi3.0/dp_stats.c

@@ -388,7 +388,7 @@ void DP_PRINT_STATS(const char *fmt, ...)
 			curr_len = soc->sysfs_config->curr_buffer_length;
 			max_len = soc->sysfs_config->max_buffer_length;
 			if ((max_len - curr_len) <= 1)
-				return;
+				goto fail;
 
 			qdf_spinlock_acquire(&soc->sysfs_config->sysfs_write_user_buffer);
 			if (soc->sysfs_config->buf) {
@@ -396,7 +396,7 @@ void DP_PRINT_STATS(const char *fmt, ...)
 							 max_len - curr_len, fmt, val);
 				curr_len += buf_written;
 				if ((max_len - curr_len) <= 1)
-					return;
+					goto rel_lock;
 
 				buf_written += scnprintf(soc->sysfs_config->buf + curr_len,
 							 max_len - curr_len, "\n");
@@ -406,6 +406,12 @@ void DP_PRINT_STATS(const char *fmt, ...)
 		}
 	}
 	va_end(val);
+	return;
+
+rel_lock:
+	qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer);
+fail:
+	va_end(val);
 }
 #endif /* WLAN_SYSFS_DP_STATS */
 /**