From 170f5f103ec17bcb478c08d3125af3a5d35bf64e Mon Sep 17 00:00:00 2001 From: Hardik Arya Date: Wed, 22 Nov 2017 12:25:39 -0800 Subject: [PATCH] diag: Increment data ready only if it is first update Increment data ready only if it is not incremented earlier. Change-Id: Ia61e638bcf18e17dfe4bef15fc8ed4168b4c1891 Signed-off-by: Sreelakshmi Gownipalli Signed-off-by: Hardik Arya --- drivers/char/diag/diag_memorydevice.c | 6 ++++-- drivers/char/diag/diagchar_core.c | 7 ++++--- drivers/char/diag/diagfwd.c | 9 ++++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/char/diag/diag_memorydevice.c b/drivers/char/diag/diag_memorydevice.c index 3fe61c0b7b4c..f1021da1b9ed 100644 --- a/drivers/char/diag/diag_memorydevice.c +++ b/drivers/char/diag/diag_memorydevice.c @@ -178,8 +178,10 @@ int diag_md_write(int id, unsigned char *buf, int len, int ctx) continue; } found = 1; - driver->data_ready[i] |= USER_SPACE_DATA_TYPE; - atomic_inc(&driver->data_ready_notif[i]); + if (!(driver->data_ready[i] & USER_SPACE_DATA_TYPE)) { + 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); } diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index ebe4663531ef..9b7d3c773261 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -1436,9 +1436,10 @@ static int diag_ioctl_lsm_deinit(void) mutex_unlock(&driver->diagchar_mutex); return -EINVAL; } - - driver->data_ready[i] |= DEINIT_TYPE; - atomic_inc(&driver->data_ready_notif[i]); + if (!(driver->data_ready[i] & DEINIT_TYPE)) { + driver->data_ready[i] |= DEINIT_TYPE; + atomic_inc(&driver->data_ready_notif[i]); + } mutex_unlock(&driver->diagchar_mutex); wake_up_interruptible(&driver->wait_q); diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index f6d81c2448fd..f24bc9ef9f77 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -429,7 +429,8 @@ 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)) { driver->data_ready[i] |= type; atomic_inc(&driver->data_ready_notif[i]); } @@ -444,8 +445,10 @@ void diag_update_sleeping_process(int process_id, int data_type) mutex_lock(&driver->diagchar_mutex); 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]); + if (!(driver->data_ready[i] & data_type)) { + driver->data_ready[i] |= data_type; + atomic_inc(&driver->data_ready_notif[i]); + } break; } wake_up_interruptible(&driver->wait_q);