Loading drivers/char/diag/diag_memorydevice.c +1 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading drivers/char/diag/diagchar.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading drivers/char/diag/diagchar_core.c +22 −13 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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); Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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); Loading drivers/char/diag/diagfwd.c +10 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading @@ -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; } } Loading @@ -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); Loading Loading @@ -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) Loading Loading
drivers/char/diag/diag_memorydevice.c +1 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading
drivers/char/diag/diagchar.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading
drivers/char/diag/diagchar_core.c +22 −13 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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); Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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); Loading
drivers/char/diag/diagfwd.c +10 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading @@ -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; } } Loading @@ -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); Loading Loading @@ -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) Loading