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

Commit e68c27ad authored by Manoj Prabhu B's avatar Manoj Prabhu B
Browse files

diag: Synchronize msg mask read and write on a peripheral



The patch synchronizes msg mask read and write on a peripheral
by proper protection of mask_info and msg_mask_table_count.

CRs-Fixed: 2042362, 2055291
Change-Id: If136012855834b0b8cba91eb66bf711750e8f372
Signed-off-by: default avatarManoj Prabhu B <bmanoj@codeaurora.org>
parent 9a44d8dd
Loading
Loading
Loading
Loading
+30 −22
Original line number Diff line number Diff line
@@ -291,6 +291,7 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last)
	struct diag_mask_info *mask_info = NULL;
	struct diag_msg_mask_t *mask = NULL;
	struct diag_ctrl_msg_mask header;
	uint8_t msg_mask_tbl_count_local;

	if (peripheral >= NUM_PERIPHERALS)
		return;
@@ -317,6 +318,8 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last)
		return;
	}
	buf = mask_info->update_buf;
	msg_mask_tbl_count_local = driver->msg_mask_tbl_count;
	mutex_unlock(&driver->msg_mask_lock);
	mutex_lock(&mask_info->lock);
	switch (mask_info->status) {
	case DIAG_CTRL_MASK_ALL_DISABLED:
@@ -333,9 +336,11 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last)
		goto err;
	}

	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
		if (((first < mask->ssid_first) ||
		     (last > mask->ssid_last_tools)) && first != ALL_SSID) {
	for (i = 0; i < msg_mask_tbl_count_local; i++, mask++) {
		mutex_lock(&driver->msg_mask_lock);
		if (((mask->ssid_first > first) ||
			(mask->ssid_last_tools < last)) && first != ALL_SSID) {
			mutex_unlock(&driver->msg_mask_lock);
			continue;
		}

@@ -376,19 +381,19 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last)
		if (mask_size > 0)
			memcpy(buf + header_len, mask->ptr, mask_size);
		mutex_unlock(&mask->lock);
		mutex_unlock(&driver->msg_mask_lock);

		err = diagfwd_write(peripheral, TYPE_CNTL, buf,
				    header_len + mask_size);
		if (err && err != -ENODEV)
			pr_err_ratelimited("diag: Unable to send msg masks to peripheral %d\n",
			       peripheral);
			pr_err_ratelimited("diag: Unable to send msg masks to peripheral %d, error = %d\n",
			       peripheral, err);

		if (first != ALL_SSID)
			break;
	}
err:
	mutex_unlock(&mask_info->lock);
	mutex_unlock(&driver->msg_mask_lock);
}

static void diag_send_time_sync_update(uint8_t peripheral)
@@ -660,8 +665,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len,
	}

	req = (struct diag_msg_build_mask_t *)src_buf;
	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&mask_info->lock);
	mutex_lock(&driver->msg_mask_lock);
	mask = (struct diag_msg_mask_t *)mask_info->ptr;
	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
		if (i < (driver->msg_mask_tbl_count - 1)) {
@@ -701,6 +706,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len,
				pr_err_ratelimited("diag: In %s, unable to allocate memory for msg mask ptr, mask_size: %d\n",
						   __func__, mask_size);
				mutex_unlock(&mask->lock);
				mutex_unlock(&driver->msg_mask_lock);
				mutex_unlock(&mask_info->lock);
				return -ENOMEM;
			}
			mask->ptr = temp;
@@ -719,8 +726,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len,
		mask_info->status = DIAG_CTRL_MASK_VALID;
		break;
	}
	mutex_unlock(&mask_info->lock);
	mutex_unlock(&driver->msg_mask_lock);
	mutex_unlock(&mask_info->lock);
	if (diag_check_update(APPS_DATA))
		diag_update_userspace_clients(MSG_MASKS_TYPE);

@@ -773,9 +780,11 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len,
	}

	req = (struct diag_msg_config_rsp_t *)src_buf;

	mutex_lock(&mask_info->lock);
	mutex_lock(&driver->msg_mask_lock);

	mask = (struct diag_msg_mask_t *)mask_info->ptr;
	mutex_lock(&mask_info->lock);
	mask_info->status = (req->rt_mask) ? DIAG_CTRL_MASK_ALL_ENABLED :
					   DIAG_CTRL_MASK_ALL_DISABLED;
	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
@@ -784,8 +793,8 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len,
		       mask->range * sizeof(uint32_t));
		mutex_unlock(&mask->lock);
	}
	mutex_unlock(&mask_info->lock);
	mutex_unlock(&driver->msg_mask_lock);
	mutex_unlock(&mask_info->lock);

	if (diag_check_update(APPS_DATA))
		diag_update_userspace_clients(MSG_MASKS_TYPE);
@@ -1289,8 +1298,8 @@ static int diag_create_msg_mask_table(void)
	struct diag_msg_mask_t *mask = (struct diag_msg_mask_t *)msg_mask.ptr;
	struct diag_ssid_range_t range;

	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&msg_mask.lock);
	mutex_lock(&driver->msg_mask_lock);
	driver->msg_mask_tbl_count = MSG_MASK_TBL_CNT;
	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
		range.ssid_first = msg_mask_tbl[i].ssid_first;
@@ -1299,8 +1308,8 @@ static int diag_create_msg_mask_table(void)
		if (err)
			break;
	}
	mutex_unlock(&msg_mask.lock);
	mutex_unlock(&driver->msg_mask_lock);
	mutex_unlock(&msg_mask.lock);
	return err;
}

@@ -1313,8 +1322,8 @@ static int diag_create_build_time_mask(void)
	struct diag_msg_mask_t *build_mask = NULL;
	struct diag_ssid_range_t range;

	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&msg_bt_mask.lock);
	mutex_lock(&driver->msg_mask_lock);
	driver->bt_msg_mask_tbl_count = MSG_MASK_TBL_CNT;
	build_mask = (struct diag_msg_mask_t *)msg_bt_mask.ptr;
	for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) {
@@ -1427,9 +1436,8 @@ static int diag_create_build_time_mask(void)
		}
		memcpy(build_mask->ptr, tbl, tbl_size);
	}
	mutex_unlock(&msg_bt_mask.lock);
	mutex_unlock(&driver->msg_mask_lock);

	mutex_unlock(&msg_bt_mask.lock);
	return err;
}

@@ -1599,8 +1607,8 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src)
	err = __diag_mask_init(dest, MSG_MASK_SIZE, APPS_BUF_SIZE);
	if (err)
		return err;
	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&dest->lock);
	mutex_lock(&driver->msg_mask_lock);
	src_mask = (struct diag_msg_mask_t *)src->ptr;
	dest_mask = (struct diag_msg_mask_t *)dest->ptr;

@@ -1617,9 +1625,8 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src)
		src_mask++;
		dest_mask++;
	}
	mutex_unlock(&dest->lock);
	mutex_unlock(&driver->msg_mask_lock);

	mutex_unlock(&dest->lock);
	return err;
}

@@ -1630,15 +1637,15 @@ void diag_msg_mask_free(struct diag_mask_info *mask_info)

	if (!mask_info)
		return;
	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&mask_info->lock);
	mutex_lock(&driver->msg_mask_lock);
	mask = (struct diag_msg_mask_t *)mask_info->ptr;
	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
		kfree(mask->ptr);
		mask->ptr = NULL;
	}
	mutex_unlock(&mask_info->lock);
	mutex_unlock(&driver->msg_mask_lock);
	mutex_unlock(&mask_info->lock);
	__diag_mask_exit(mask_info);
}

@@ -1807,8 +1814,9 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
		return -EIO;
	}
	mutex_unlock(&driver->diag_maskclear_mutex);
	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&mask_info->lock);
	mutex_lock(&driver->msg_mask_lock);

	mask = (struct diag_msg_mask_t *)(mask_info->ptr);
	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
		ptr = mask_info->update_buf;
@@ -1845,8 +1853,8 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
		}
		total_len += len;
	}
	mutex_unlock(&mask_info->lock);
	mutex_unlock(&driver->msg_mask_lock);
	mutex_unlock(&mask_info->lock);
	return err ? err : total_len;
}