Unverified Commit bb551394 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!2926 Fixed some issues of ultrasoc-smb

Merge Pull Request from: @cj-xiaocai 
 
1) Fixed the BUG of atomic-sleep
Patch#1 coresight: ultrasoc-smb: Fix sleep while close preempt in enable_smb

2) Fixed uninitialized before use buf_hw_base
Patch#2 coresight: ultrasoc-smb: Config SMB buffer before register sink
Patch#3 coresight: ultrasoc-smb: Fix uninitialized before use buf_hw_base

https://gitee.com/openeuler/kernel/issues/I8ICOU 
 
Link:https://gitee.com/openeuler/kernel/pulls/2926

 

Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 273a4fbc 02934071
Loading
Loading
Loading
Loading
+23 −35
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ static int smb_open(struct inode *inode, struct file *file)
					struct smb_drv_data, miscdev);
	int ret = 0;

	mutex_lock(&drvdata->mutex);
	spin_lock(&drvdata->spinlock);

	if (drvdata->reading) {
		ret = -EBUSY;
@@ -115,7 +115,7 @@ static int smb_open(struct inode *inode, struct file *file)

	drvdata->reading = true;
out:
	mutex_unlock(&drvdata->mutex);
	spin_unlock(&drvdata->spinlock);

	return ret;
}
@@ -132,10 +132,8 @@ static ssize_t smb_read(struct file *file, char __user *data, size_t len,
	if (!len)
		return 0;

	mutex_lock(&drvdata->mutex);

	if (!sdb->data_size)
		goto out;
		return 0;

	to_copy = min(sdb->data_size, len);

@@ -145,20 +143,15 @@ static ssize_t smb_read(struct file *file, char __user *data, size_t len,

	if (copy_to_user(data, sdb->buf_base + sdb->buf_rdptr, to_copy)) {
		dev_dbg(dev, "Failed to copy data to user\n");
		to_copy = -EFAULT;
		goto out;
		return -EFAULT;
	}

	*ppos += to_copy;

	smb_update_read_ptr(drvdata, to_copy);

	dev_dbg(dev, "%zu bytes copied\n", to_copy);
out:
	if (!sdb->data_size)
		smb_reset_buffer(drvdata);
	mutex_unlock(&drvdata->mutex);

	dev_dbg(dev, "%zu bytes copied\n", to_copy);
	return to_copy;
}

@@ -167,9 +160,9 @@ static int smb_release(struct inode *inode, struct file *file)
	struct smb_drv_data *drvdata = container_of(file->private_data,
					struct smb_drv_data, miscdev);

	mutex_lock(&drvdata->mutex);
	spin_lock(&drvdata->spinlock);
	drvdata->reading = false;
	mutex_unlock(&drvdata->mutex);
	spin_unlock(&drvdata->spinlock);

	return 0;
}
@@ -261,7 +254,7 @@ static int smb_enable(struct coresight_device *csdev, u32 mode, void *data)
	struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
	int ret = 0;

	mutex_lock(&drvdata->mutex);
	spin_lock(&drvdata->spinlock);

	/* Do nothing, the trace data is reading by other interface now */
	if (drvdata->reading) {
@@ -293,7 +286,7 @@ static int smb_enable(struct coresight_device *csdev, u32 mode, void *data)

	dev_dbg(&csdev->dev, "Ultrasoc SMB enabled\n");
out:
	mutex_unlock(&drvdata->mutex);
	spin_unlock(&drvdata->spinlock);

	return ret;
}
@@ -303,7 +296,7 @@ static int smb_disable(struct coresight_device *csdev)
	struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
	int ret = 0;

	mutex_lock(&drvdata->mutex);
	spin_lock(&drvdata->spinlock);

	if (drvdata->reading) {
		ret = -EBUSY;
@@ -326,7 +319,7 @@ static int smb_disable(struct coresight_device *csdev)

	dev_dbg(&csdev->dev, "Ultrasoc SMB disabled\n");
out:
	mutex_unlock(&drvdata->mutex);
	spin_unlock(&drvdata->spinlock);

	return ret;
}
@@ -407,7 +400,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
	if (!buf)
		return 0;

	mutex_lock(&drvdata->mutex);
	spin_lock(&drvdata->spinlock);

	/* Don't do anything if another tracer is using this sink. */
	if (atomic_read(csdev->refcnt) != 1)
@@ -431,7 +424,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
	if (!buf->snapshot && lost)
		perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
out:
	mutex_unlock(&drvdata->mutex);
	spin_unlock(&drvdata->spinlock);

	return data_size;
}
@@ -483,7 +476,6 @@ static int smb_init_data_buffer(struct platform_device *pdev,
static void smb_init_hw(struct smb_drv_data *drvdata)
{
	smb_disable_hw(drvdata);
	smb_reset_buffer(drvdata);

	writel(SMB_LB_CFG_LO_DEFAULT, drvdata->base + SMB_LB_CFG_LO_REG);
	writel(SMB_LB_CFG_HI_DEFAULT, drvdata->base + SMB_LB_CFG_HI_REG);
@@ -589,37 +581,33 @@ static int smb_probe(struct platform_device *pdev)
		return ret;
	}

	mutex_init(&drvdata->mutex);
	ret = smb_config_inport(dev, true);
	if (ret)
		return ret;

	smb_reset_buffer(drvdata);
	platform_set_drvdata(pdev, drvdata);
	spin_lock_init(&drvdata->spinlock);
	drvdata->pid = -1;

	ret = smb_register_sink(pdev, drvdata);
	if (ret) {
		smb_config_inport(&pdev->dev, false);
		dev_err(dev, "Failed to register SMB sink\n");
		return ret;
	}

	ret = smb_config_inport(dev, true);
	if (ret) {
		smb_unregister_sink(drvdata);
		return ret;
	}

	platform_set_drvdata(pdev, drvdata);

	return 0;
}

static int smb_remove(struct platform_device *pdev)
{
	struct smb_drv_data *drvdata = platform_get_drvdata(pdev);
	int ret;

	ret = smb_config_inport(&pdev->dev, false);
	if (ret)
		return ret;

	smb_unregister_sink(drvdata);

	smb_config_inport(&pdev->dev, false);

	return 0;
}

+3 −3
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
#define _ULTRASOC_SMB_H

#include <linux/miscdevice.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>

/* Offset of SMB global registers */
#define SMB_GLB_CFG_REG		0x00
@@ -105,7 +105,7 @@ struct smb_data_buffer {
 * @csdev:	Component vitals needed by the framework.
 * @sdb:	Data buffer for SMB.
 * @miscdev:	Specifics to handle "/dev/xyz.smb" entry.
 * @mutex:	Control data access to one at a time.
 * @spinlock:	Control data access to one at a time.
 * @reading:	Synchronise user space access to SMB buffer.
 * @pid:	Process ID of the process being monitored by the
 *		session that is using this component.
@@ -116,7 +116,7 @@ struct smb_drv_data {
	struct coresight_device	*csdev;
	struct smb_data_buffer sdb;
	struct miscdevice miscdev;
	struct mutex mutex;
	spinlock_t spinlock;
	bool reading;
	pid_t pid;
	u32 mode;