qcacmn: pkt_log: Use qdf_spin_lock APIs debug infrastructure

Use QDF spin_lock APIs so that we can make use the debug infra.
This will help to identify catch issue related to unbalanced lock
operations or unexpectedely long locks.

Change-Id: I318bcb90340d98813f19862fda14e6ada30bbed6
CRs-Fixed: 2349308
This commit is contained in:
Manjunathappa Prakash
2018-11-13 16:22:25 -08:00
committed by nshrivas
parent f8ccc18f6a
commit c6e684b128
4 changed files with 33 additions and 32 deletions

View File

@@ -33,10 +33,11 @@
#define NO_REG_FUNCS 4 #define NO_REG_FUNCS 4
/* Locking interface for pktlog */ /* Locking interface for pktlog */
#define PKTLOG_LOCK_INIT(_pl_info) spin_lock_init(&(_pl_info)->log_lock) #define PKTLOG_LOCK_INIT(_pl_info) qdf_spinlock_create(&(_pl_info)->log_lock)
#define PKTLOG_LOCK_DESTROY(_pl_info) #define PKTLOG_LOCK_DESTROY(_pl_info) \
#define PKTLOG_LOCK(_pl_info) spin_lock(&(_pl_info)->log_lock) qdf_spinlock_destroy(&(_pl_info)->log_lock)
#define PKTLOG_UNLOCK(_pl_info) spin_unlock(&(_pl_info)->log_lock) #define PKTLOG_LOCK(_pl_info) qdf_spin_lock_bh(&(_pl_info)->log_lock)
#define PKTLOG_UNLOCK(_pl_info) qdf_spin_unlock_bh(&(_pl_info)->log_lock)
#define PKTLOG_MODE_SYSTEM 1 #define PKTLOG_MODE_SYSTEM 1
#define PKTLOG_MODE_ADAPTER 2 #define PKTLOG_MODE_ADAPTER 2

View File

@@ -99,7 +99,7 @@ struct ath_pktlog_info {
/* Size of buffer in bytes */ /* Size of buffer in bytes */
int32_t buf_size; int32_t buf_size;
spinlock_t log_lock; qdf_spinlock_t log_lock;
struct mutex pktlog_mutex; struct mutex pktlog_mutex;
/* Threshold of TCP SACK packets for triggered stop */ /* Threshold of TCP SACK packets for triggered stop */

View File

@@ -112,13 +112,13 @@ int pktlog_alloc_buf(struct hif_opaque_softc *scn)
page_cnt = (sizeof(*(pl_info->buf)) + pl_info->buf_size) / PAGE_SIZE; page_cnt = (sizeof(*(pl_info->buf)) + pl_info->buf_size) / PAGE_SIZE;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
if (pl_info->buf != NULL) { if (pl_info->buf != NULL) {
qdf_spin_unlock_bh(&pl_info->log_lock);
printk(PKTLOG_TAG "Buffer is already in use\n"); printk(PKTLOG_TAG "Buffer is already in use\n");
spin_unlock_bh(&pl_info->log_lock);
return -EINVAL; return -EINVAL;
} }
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
buffer = vmalloc((page_cnt + 2) * PAGE_SIZE); buffer = vmalloc((page_cnt + 2) * PAGE_SIZE);
if (buffer == NULL) { if (buffer == NULL) {
@@ -139,12 +139,12 @@ int pktlog_alloc_buf(struct hif_opaque_softc *scn)
SetPageReserved(vpg); SetPageReserved(vpg);
} }
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
if (pl_info->buf != NULL) if (pl_info->buf != NULL)
pktlog_release_buf(scn); pktlog_release_buf(scn);
pl_info->buf = buffer; pl_info->buf = buffer;
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return 0; return 0;
} }
@@ -514,13 +514,13 @@ static void pktlog_detach(struct hif_opaque_softc *scn)
remove_proc_entry(WLANDEV_BASENAME, g_pktlog_pde); remove_proc_entry(WLANDEV_BASENAME, g_pktlog_pde);
pktlog_sysctl_unregister(pl_dev); pktlog_sysctl_unregister(pl_dev);
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
if (pl_info->buf) { if (pl_info->buf) {
pktlog_release_buf(scn); pktlog_release_buf(scn);
pl_dev->tgt_pktlog_alloced = false; pl_dev->tgt_pktlog_alloced = false;
} }
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
pktlog_cleanup(pl_info); pktlog_cleanup(pl_info);
if (pl_dev) { if (pl_dev) {
@@ -700,14 +700,14 @@ pktlog_read_proc_entry(char *buf, size_t nbytes, loff_t *ppos,
int fold_offset, ppos_data, cur_rd_offset, cur_wr_offset; int fold_offset, ppos_data, cur_rd_offset, cur_wr_offset;
struct ath_pktlog_buf *log_buf; struct ath_pktlog_buf *log_buf;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
log_buf = pl_info->buf; log_buf = pl_info->buf;
*read_complete = false; *read_complete = false;
if (log_buf == NULL) { if (log_buf == NULL) {
*read_complete = true; *read_complete = true;
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return 0; return 0;
} }
@@ -824,7 +824,7 @@ rd_done:
*read_complete = true; *read_complete = true;
} }
} }
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return ret_val; return ret_val;
} }
@@ -849,11 +849,11 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
if (!pl_info) if (!pl_info)
return 0; return 0;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
log_buf = pl_info->buf; log_buf = pl_info->buf;
if (log_buf == NULL) { if (log_buf == NULL) {
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return 0; return 0;
} }
@@ -862,7 +862,7 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
* When issuing cat command, ensure to send * When issuing cat command, ensure to send
* pktlog disable command first. * pktlog disable command first.
*/ */
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return -EINVAL; return -EINVAL;
} }
@@ -880,14 +880,14 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
if (*ppos < bufhdr_size) { if (*ppos < bufhdr_size) {
count = QDF_MIN((bufhdr_size - *ppos), rem_len); count = QDF_MIN((bufhdr_size - *ppos), rem_len);
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
if (copy_to_user(buf, ((char *)&log_buf->bufhdr) + *ppos, if (copy_to_user(buf, ((char *)&log_buf->bufhdr) + *ppos,
count)) { count)) {
return -EFAULT; return -EFAULT;
} }
rem_len -= count; rem_len -= count;
ret_val += count; ret_val += count;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
} }
start_offset = log_buf->rd_offset; start_offset = log_buf->rd_offset;
@@ -929,7 +929,7 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
goto rd_done; goto rd_done;
count = QDF_MIN(rem_len, (end_offset - ppos_data + 1)); count = QDF_MIN(rem_len, (end_offset - ppos_data + 1));
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
if (copy_to_user(buf + ret_val, if (copy_to_user(buf + ret_val,
log_buf->log_data + ppos_data, count)) { log_buf->log_data + ppos_data, count)) {
@@ -938,11 +938,11 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
ret_val += count; ret_val += count;
rem_len -= count; rem_len -= count;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
} else { } else {
if (ppos_data <= fold_offset) { if (ppos_data <= fold_offset) {
count = QDF_MIN(rem_len, (fold_offset - ppos_data + 1)); count = QDF_MIN(rem_len, (fold_offset - ppos_data + 1));
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
if (copy_to_user(buf + ret_val, if (copy_to_user(buf + ret_val,
log_buf->log_data + ppos_data, log_buf->log_data + ppos_data,
count)) { count)) {
@@ -950,7 +950,7 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
} }
ret_val += count; ret_val += count;
rem_len -= count; rem_len -= count;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
} }
if (rem_len == 0) if (rem_len == 0)
@@ -962,7 +962,7 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
if (ppos_data <= end_offset) { if (ppos_data <= end_offset) {
count = QDF_MIN(rem_len, (end_offset - ppos_data + 1)); count = QDF_MIN(rem_len, (end_offset - ppos_data + 1));
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
if (copy_to_user(buf + ret_val, if (copy_to_user(buf + ret_val,
log_buf->log_data + ppos_data, log_buf->log_data + ppos_data,
count)) { count)) {
@@ -970,7 +970,7 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos)
} }
ret_val += count; ret_val += count;
rem_len -= count; rem_len -= count;
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
} }
} }
@@ -981,7 +981,7 @@ rd_done:
} }
*ppos += ret_val; *ppos += ret_val;
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return ret_val; return ret_val;
} }

View File

@@ -688,7 +688,7 @@ static int __pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
} }
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
pl_info->buf->bufhdr.version = CUR_PKTLOG_VER; pl_info->buf->bufhdr.version = CUR_PKTLOG_VER;
pl_info->buf->bufhdr.magic_num = PKTLOG_MAGIC_NUM; pl_info->buf->bufhdr.magic_num = PKTLOG_MAGIC_NUM;
pl_info->buf->wr_offset = 0; pl_info->buf->wr_offset = 0;
@@ -697,7 +697,7 @@ static int __pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
pl_info->buf->bytes_written = 0; pl_info->buf->bytes_written = 0;
pl_info->buf->msg_index = 1; pl_info->buf->msg_index = 1;
pl_info->buf->offset = PKTLOG_READ_OFFSET; pl_info->buf->offset = PKTLOG_READ_OFFSET;
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
pl_info->start_time_thruput = os_get_timestamp(); pl_info->start_time_thruput = os_get_timestamp();
pl_info->start_time_per = pl_info->start_time_thruput; pl_info->start_time_per = pl_info->start_time_thruput;
@@ -833,14 +833,14 @@ static int __pktlog_setsize(struct hif_opaque_softc *scn, int32_t size)
return -EINVAL; return -EINVAL;
} }
spin_lock_bh(&pl_info->log_lock); qdf_spin_lock_bh(&pl_info->log_lock);
if (pl_info->buf != NULL) { if (pl_info->buf != NULL) {
if (pl_dev->is_pktlog_cb_subscribed && if (pl_dev->is_pktlog_cb_subscribed &&
wdi_pktlog_unsubscribe(pdev, pl_info->log_state)) { wdi_pktlog_unsubscribe(pdev, pl_info->log_state)) {
pl_info->curr_pkt_state = pl_info->curr_pkt_state =
PKTLOG_OPR_NOT_IN_PROGRESS; PKTLOG_OPR_NOT_IN_PROGRESS;
qdf_spin_unlock_bh(&pl_info->log_lock);
qdf_print("Cannot unsubscribe pktlog from the WDI"); qdf_print("Cannot unsubscribe pktlog from the WDI");
spin_unlock_bh(&pl_info->log_lock);
return -EFAULT; return -EFAULT;
} }
pktlog_release_buf(scn); pktlog_release_buf(scn);
@@ -853,7 +853,7 @@ static int __pktlog_setsize(struct hif_opaque_softc *scn, int32_t size)
pl_info->buf_size = size; pl_info->buf_size = size;
} }
pl_info->curr_pkt_state = PKTLOG_OPR_NOT_IN_PROGRESS; pl_info->curr_pkt_state = PKTLOG_OPR_NOT_IN_PROGRESS;
spin_unlock_bh(&pl_info->log_lock); qdf_spin_unlock_bh(&pl_info->log_lock);
return 0; return 0;
} }