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

Commit e729e468 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "diag: Handle data ready notification properly"

parents 708dee99 7cfe2435
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -199,6 +199,7 @@ int diag_md_write(int id, unsigned char *buf, int len, int ctx)

		found = 1;
		driver->data_ready[i] |= USER_SPACE_DATA_TYPE;
		atomic_inc(&driver->data_ready_notif[i]);
		pr_debug("diag: wake up logging process\n");
		wake_up_interruptible(&driver->wait_q);
	}
+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@
#include <linux/atomic.h>
#include "diagfwd_bridge.h"

#define THRESHOLD_CLIENT_LIMIT	50

/* Size of the USB buffers used for read and write*/
#define USB_MAX_OUT_BUF 4096
#define APPS_BUF_SIZE	4096
@@ -544,6 +546,7 @@ struct diagchar_dev {
	wait_queue_head_t wait_q;
	struct diag_client_map *client_map;
	int *data_ready;
	atomic_t data_ready_notif[THRESHOLD_CLIENT_LIMIT];
	int num_clients;
	int polling_reg_flag;
	int use_device_tree;
+22 −13
Original line number Diff line number Diff line
@@ -136,7 +136,6 @@ module_param(poolsize_qsc_usb, uint, 0000);

/* This is the max number of user-space clients supported at initialization*/
static unsigned int max_clients = 15;
static unsigned int threshold_client_limit = 50;
module_param(max_clients, uint, 0000);

/* Timer variables */
@@ -324,7 +323,7 @@ static int diagchar_open(struct inode *inode, struct file *file)
		if (i < driver->num_clients) {
			diag_add_client(i, file);
		} else {
			if (i < threshold_client_limit) {
			if (i < THRESHOLD_CLIENT_LIMIT) {
				driver->num_clients++;
				temp = krealloc(driver->client_map
					, (driver->num_clients) * sizeof(struct
@@ -354,11 +353,17 @@ static int diagchar_open(struct inode *inode, struct file *file)
			}
		}
		driver->data_ready[i] = 0x0;
		atomic_set(&driver->data_ready_notif[i], 0);
		driver->data_ready[i] |= MSG_MASKS_TYPE;
		atomic_inc(&driver->data_ready_notif[i]);
		driver->data_ready[i] |= EVENT_MASKS_TYPE;
		atomic_inc(&driver->data_ready_notif[i]);
		driver->data_ready[i] |= LOG_MASKS_TYPE;
		atomic_inc(&driver->data_ready_notif[i]);
		driver->data_ready[i] |= DCI_LOG_MASKS_TYPE;
		atomic_inc(&driver->data_ready_notif[i]);
		driver->data_ready[i] |= DCI_EVENT_MASKS_TYPE;
		atomic_inc(&driver->data_ready_notif[i]);

		if (driver->ref_count == 0)
			diag_mempool_init();
@@ -1849,6 +1854,7 @@ static int diag_ioctl_lsm_deinit(void)
	}

	driver->data_ready[i] |= DEINIT_TYPE;
	atomic_inc(&driver->data_ready_notif[i]);
	mutex_unlock(&driver->diagchar_mutex);
	wake_up_interruptible(&driver->wait_q);

@@ -3127,16 +3133,6 @@ static int diag_user_process_apps_data(const char __user *buf, int len,
	return 0;
}

static int check_data_ready(int index)
{
	int data_type = 0;

	mutex_lock(&driver->diagchar_mutex);
	data_type = driver->data_ready[index];
	mutex_unlock(&driver->diagchar_mutex);
	return data_type;
}

static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
			  loff_t *ppos)
{
@@ -3163,7 +3159,8 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		pr_err("diag: bad address from user side\n");
		return -EFAULT;
	}
	wait_event_interruptible(driver->wait_q, (check_data_ready(index)) > 0);
	wait_event_interruptible(driver->wait_q,
			atomic_read(&driver->data_ready_notif[index]) > 0);

	mutex_lock(&driver->diagchar_mutex);

@@ -3174,6 +3171,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		/*Copy the type of data being passed*/
		data_type = driver->data_ready[index] & USER_SPACE_DATA_TYPE;
		driver->data_ready[index] ^= USER_SPACE_DATA_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		COPY_USER_SPACE_OR_ERR(buf, data_type, sizeof(int));
		if (ret == -EFAULT)
			goto exit;
@@ -3190,11 +3188,13 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		 * memory device any more, the condition needs to be cleared.
		 */
		driver->data_ready[index] ^= USER_SPACE_DATA_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
	}

	if (driver->data_ready[index] & HDLC_SUPPORT_TYPE) {
		data_type = driver->data_ready[index] & HDLC_SUPPORT_TYPE;
		driver->data_ready[index] ^= HDLC_SUPPORT_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		COPY_USER_SPACE_OR_ERR(buf, data_type, sizeof(int));
		if (ret == -EFAULT)
			goto exit;
@@ -3219,6 +3219,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		if (ret == -EFAULT)
			goto exit;
		driver->data_ready[index] ^= DEINIT_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		mutex_unlock(&driver->diagchar_mutex);
		diag_remove_client_entry(file);
		return ret;
@@ -3236,6 +3237,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		if (write_len > 0)
			ret += write_len;
		driver->data_ready[index] ^= MSG_MASKS_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		goto exit;
	}

@@ -3262,6 +3264,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
				goto exit;
		}
		driver->data_ready[index] ^= EVENT_MASKS_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		goto exit;
	}

@@ -3278,6 +3281,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		if (write_len > 0)
			ret += write_len;
		driver->data_ready[index] ^= LOG_MASKS_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		goto exit;
	}

@@ -3294,6 +3298,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		if (ret == -EFAULT)
			goto exit;
		driver->data_ready[index] ^= PKT_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		driver->in_busy_pktdata = 0;
		goto exit;
	}
@@ -3311,6 +3316,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
			goto exit;

		driver->data_ready[index] ^= DCI_PKT_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		driver->in_busy_dcipktdata = 0;
		goto exit;
	}
@@ -3333,6 +3339,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
			goto exit;

		driver->data_ready[index] ^= DCI_EVENT_MASKS_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		goto exit;
	}

@@ -3353,6 +3360,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
		if (ret == -EFAULT)
			goto exit;
		driver->data_ready[index] ^= DCI_LOG_MASKS_TYPE;
		atomic_dec(&driver->data_ready_notif[index]);
		goto exit;
	}

@@ -3384,6 +3392,7 @@ static ssize_t diagchar_read(struct file *file, char __user *buf, size_t count,
			exit_stat = diag_copy_dci(buf, count, entry, &ret);
			mutex_lock(&driver->diagchar_mutex);
			driver->data_ready[index] ^= DCI_DATA_TYPE;
			atomic_dec(&driver->data_ready_notif[index]);
			mutex_unlock(&driver->diagchar_mutex);
			if (exit_stat == 1) {
				mutex_unlock(&driver->dci_mutex);
+10 −1
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ void chk_logging_wakeup(void)
			 * situation.
			 */
			driver->data_ready[i] |= USER_SPACE_DATA_TYPE;
			atomic_inc(&driver->data_ready_notif[i]);
			pr_debug("diag: Force wakeup of logging process\n");
			wake_up_interruptible(&driver->wait_q);
			break;
@@ -462,8 +463,10 @@ void diag_update_userspace_clients(unsigned int type)

	mutex_lock(&driver->diagchar_mutex);
	for (i = 0; i < driver->num_clients; i++)
		if (driver->client_map[i].pid != 0)
		if (driver->client_map[i].pid != 0) {
			driver->data_ready[i] |= type;
			atomic_inc(&driver->data_ready_notif[i]);
		}
	wake_up_interruptible(&driver->wait_q);
	mutex_unlock(&driver->diagchar_mutex);
}
@@ -480,6 +483,8 @@ void diag_update_md_clients(unsigned int type)
					driver->client_map[j].pid ==
					driver->md_session_map[i]->pid) {
					driver->data_ready[j] |= type;
					atomic_inc(
						&driver->data_ready_notif[j]);
					break;
				}
			}
@@ -495,6 +500,7 @@ void diag_update_sleeping_process(int process_id, int data_type)
	for (i = 0; i < driver->num_clients; i++)
		if (driver->client_map[i].pid == process_id) {
			driver->data_ready[i] |= data_type;
			atomic_inc(&driver->data_ready_notif[i]);
			break;
		}
	wake_up_interruptible(&driver->wait_q);
@@ -1775,6 +1781,9 @@ int diagfwd_init(void)
	}
	kmemleak_not_leak(driver->data_ready);

	for (i = 0; i < THRESHOLD_CLIENT_LIMIT; i++)
		atomic_set(&driver->data_ready_notif[i], 0);

	if (driver->apps_req_buf == NULL) {
		driver->apps_req_buf = kzalloc(DIAG_MAX_REQ_SIZE, GFP_KERNEL);
		if (!driver->apps_req_buf)