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

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

diag: Wait with timeout while apps data buffers are flushed



Prevent diag clients stuck waiting for apps data buffers to
get flushed by use of timeout.

Change-Id: Ia3efccb919a82ebd8628ab246d5d73c455b919e8
Signed-off-by: default avatarManoj Prabhu B <bmanoj@codeaurora.org>
parent 42a3bb39
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved.
 */

#ifndef DIAGCHAR_H
@@ -225,6 +225,8 @@
#define HDLC_CTXT		1
#define NON_HDLC_CTXT	2

#define PKT_PROCESS_TIMEOUT		200

#define TYPE_DATA		0
#define TYPE_CNTL		1
#define TYPE_DCI		2
+33 −9
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/slab.h>
@@ -14,6 +14,7 @@
#include <linux/sched.h>
#include <linux/ratelimit.h>
#include <linux/timer.h>
#include <linux/jiffies.h>
#include <linux/sched/task.h>
#ifdef CONFIG_DIAG_OVER_USB
#include <linux/usb/usbdiag.h>
@@ -3085,7 +3086,7 @@ long diagchar_ioctl(struct file *filp,
static int diag_process_apps_data_hdlc(unsigned char *buf, int len,
				       int pkt_type)
{
	int err = 0;
	int err = 0, wait_err = 0;
	int ret = PKT_DROP;
	struct diag_apps_data_t *data = &hdlc_data;
	struct diag_send_desc_type send = { NULL, NULL, DIAG_STATE_START, 0 };
@@ -3116,8 +3117,15 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len,
	send.terminate = 1;

wait_for_buffer:
	wait_event_interruptible(driver->hdlc_wait_q,
			(data->flushed == 0));
	wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q,
			(data->flushed == 0),
			msecs_to_jiffies(PKT_PROCESS_TIMEOUT));
	if (wait_err <= 0) {
		DIAG_LOG(DIAG_DEBUG_USERSPACE,
		"diag: Timeout while waiting for hdlc buffer to be flushed, err: %d\n",
		wait_err);
		return PKT_DROP;
	}
	spin_lock_irqsave(&driver->diagmem_lock, flags);
	if (data->flushed) {
		spin_unlock_irqrestore(&driver->diagmem_lock, flags);
@@ -3168,8 +3176,16 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len,
			goto fail_free_buf;
		}
wait_for_agg_buff:
		wait_event_interruptible(driver->hdlc_wait_q,
			(data->flushed == 0));
		wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q,
				(data->flushed == 0),
				msecs_to_jiffies(PKT_PROCESS_TIMEOUT));
		if (wait_err <= 0) {
			DIAG_LOG(DIAG_DEBUG_USERSPACE,
			"diag: Timeout while waiting for hdlc aggregation buffer to be flushed, err: %d\n",
			wait_err);
			return PKT_DROP;
		}

		spin_lock_irqsave(&driver->diagmem_lock, flags);
		if (data->flushed) {
			spin_unlock_irqrestore(&driver->diagmem_lock, flags);
@@ -3227,7 +3243,7 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len,
static int diag_process_apps_data_non_hdlc(unsigned char *buf, int len,
					   int pkt_type)
{
	int err = 0;
	int err = 0, wait_err = 0;
	int ret = PKT_DROP;
	struct diag_pkt_frame_t header;
	struct diag_apps_data_t *data = &non_hdlc_data;
@@ -3245,8 +3261,16 @@ static int diag_process_apps_data_non_hdlc(unsigned char *buf, int len,
		return -EIO;
	}
wait_for_buffer:
	wait_event_interruptible(driver->hdlc_wait_q,
			(data->flushed == 0));
	wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q,
					(data->flushed == 0),
					msecs_to_jiffies(PKT_PROCESS_TIMEOUT));
	if (wait_err <= 0) {
		DIAG_LOG(DIAG_DEBUG_USERSPACE,
		"diag: Timeout while waiting for non-hdlc buffer to be flushed, err: %d\n",
		wait_err);
		return PKT_DROP;
	}

	spin_lock_irqsave(&driver->diagmem_lock, flags);
	if (data->flushed) {
		spin_unlock_irqrestore(&driver->diagmem_lock, flags);