Loading drivers/hwtracing/coresight/coresight-byte-cntr.c +24 −10 Original line number Original line Diff line number Diff line Loading @@ -72,25 +72,31 @@ static ssize_t tmc_etr_byte_cntr_read(struct file *fp, char __user *data, { { struct byte_cntr *byte_cntr_data = fp->private_data; struct byte_cntr *byte_cntr_data = fp->private_data; char *bufp; char *bufp; int ret = 0; if (!data) if (!data) return -EINVAL; return -EINVAL; mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (!byte_cntr_data->read_active) if (!byte_cntr_data->read_active) { ret = -EINVAL; goto err0; goto err0; } if (byte_cntr_data->enable) { if (byte_cntr_data->enable) { if (!atomic_read(&byte_cntr_data->irq_cnt)) { if (!atomic_read(&byte_cntr_data->irq_cnt)) { mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); if (wait_event_interruptible(byte_cntr_data->wq, if (wait_event_interruptible(byte_cntr_data->wq, atomic_read(&byte_cntr_data->irq_cnt) > 0)) atomic_read(&byte_cntr_data->irq_cnt) > 0 || !byte_cntr_data->enable)) return -ERESTARTSYS; return -ERESTARTSYS; mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (!byte_cntr_data->read_active) if (!byte_cntr_data->read_active) { ret = -EINVAL; goto err0; goto err0; } } } tmc_etr_read_bytes(byte_cntr_data, ppos, tmc_etr_read_bytes(byte_cntr_data, ppos, byte_cntr_data->block_size, &len, &bufp); byte_cntr_data->block_size, &len, &bufp); Loading @@ -98,8 +104,10 @@ static ssize_t tmc_etr_byte_cntr_read(struct file *fp, char __user *data, if (!atomic_read(&byte_cntr_data->irq_cnt)) { if (!atomic_read(&byte_cntr_data->irq_cnt)) { tmc_etr_flush_bytes(ppos, byte_cntr_data->block_size, tmc_etr_flush_bytes(ppos, byte_cntr_data->block_size, &len); &len); if (!len) if (!len) { ret = -EINVAL; goto err0; goto err0; } } else { } else { tmc_etr_read_bytes(byte_cntr_data, ppos, tmc_etr_read_bytes(byte_cntr_data, ppos, byte_cntr_data->block_size, byte_cntr_data->block_size, Loading @@ -117,9 +125,14 @@ static ssize_t tmc_etr_byte_cntr_read(struct file *fp, char __user *data, *ppos = 0; *ppos = 0; else else *ppos += len; *ppos += len; goto out; err0: err0: mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return ret; out: mutex_unlock(&byte_cntr_data->byte_cntr_lock); return len; return len; } } Loading @@ -130,7 +143,8 @@ void tmc_etr_byte_cntr_start(struct byte_cntr *byte_cntr_data) mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (byte_cntr_data->block_size == 0) { if (byte_cntr_data->block_size == 0 || byte_cntr_data->read_active) { mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return; return; } } Loading @@ -148,6 +162,8 @@ void tmc_etr_byte_cntr_stop(struct byte_cntr *byte_cntr_data) mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); byte_cntr_data->enable = false; byte_cntr_data->enable = false; byte_cntr_data->read_active = false; wake_up(&byte_cntr_data->wq); coresight_csr_set_byte_cntr(byte_cntr_data->csr, 0); coresight_csr_set_byte_cntr(byte_cntr_data->csr, 0); mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); Loading Loading @@ -214,7 +230,7 @@ static int tmc_etr_byte_cntr_open(struct inode *in, struct file *fp) mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (!tmcdrvdata->enable || !byte_cntr_data->block_size) { if (!byte_cntr_data->enable || !byte_cntr_data->block_size) { mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return -EINVAL; return -EINVAL; } } Loading @@ -227,10 +243,8 @@ static int tmc_etr_byte_cntr_open(struct inode *in, struct file *fp) fp->private_data = byte_cntr_data; fp->private_data = byte_cntr_data; nonseekable_open(in, fp); nonseekable_open(in, fp); byte_cntr_data->enable = true; byte_cntr_data->read_active = true; byte_cntr_data->read_active = true; mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return 0; return 0; } } Loading Loading
drivers/hwtracing/coresight/coresight-byte-cntr.c +24 −10 Original line number Original line Diff line number Diff line Loading @@ -72,25 +72,31 @@ static ssize_t tmc_etr_byte_cntr_read(struct file *fp, char __user *data, { { struct byte_cntr *byte_cntr_data = fp->private_data; struct byte_cntr *byte_cntr_data = fp->private_data; char *bufp; char *bufp; int ret = 0; if (!data) if (!data) return -EINVAL; return -EINVAL; mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (!byte_cntr_data->read_active) if (!byte_cntr_data->read_active) { ret = -EINVAL; goto err0; goto err0; } if (byte_cntr_data->enable) { if (byte_cntr_data->enable) { if (!atomic_read(&byte_cntr_data->irq_cnt)) { if (!atomic_read(&byte_cntr_data->irq_cnt)) { mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); if (wait_event_interruptible(byte_cntr_data->wq, if (wait_event_interruptible(byte_cntr_data->wq, atomic_read(&byte_cntr_data->irq_cnt) > 0)) atomic_read(&byte_cntr_data->irq_cnt) > 0 || !byte_cntr_data->enable)) return -ERESTARTSYS; return -ERESTARTSYS; mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (!byte_cntr_data->read_active) if (!byte_cntr_data->read_active) { ret = -EINVAL; goto err0; goto err0; } } } tmc_etr_read_bytes(byte_cntr_data, ppos, tmc_etr_read_bytes(byte_cntr_data, ppos, byte_cntr_data->block_size, &len, &bufp); byte_cntr_data->block_size, &len, &bufp); Loading @@ -98,8 +104,10 @@ static ssize_t tmc_etr_byte_cntr_read(struct file *fp, char __user *data, if (!atomic_read(&byte_cntr_data->irq_cnt)) { if (!atomic_read(&byte_cntr_data->irq_cnt)) { tmc_etr_flush_bytes(ppos, byte_cntr_data->block_size, tmc_etr_flush_bytes(ppos, byte_cntr_data->block_size, &len); &len); if (!len) if (!len) { ret = -EINVAL; goto err0; goto err0; } } else { } else { tmc_etr_read_bytes(byte_cntr_data, ppos, tmc_etr_read_bytes(byte_cntr_data, ppos, byte_cntr_data->block_size, byte_cntr_data->block_size, Loading @@ -117,9 +125,14 @@ static ssize_t tmc_etr_byte_cntr_read(struct file *fp, char __user *data, *ppos = 0; *ppos = 0; else else *ppos += len; *ppos += len; goto out; err0: err0: mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return ret; out: mutex_unlock(&byte_cntr_data->byte_cntr_lock); return len; return len; } } Loading @@ -130,7 +143,8 @@ void tmc_etr_byte_cntr_start(struct byte_cntr *byte_cntr_data) mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (byte_cntr_data->block_size == 0) { if (byte_cntr_data->block_size == 0 || byte_cntr_data->read_active) { mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return; return; } } Loading @@ -148,6 +162,8 @@ void tmc_etr_byte_cntr_stop(struct byte_cntr *byte_cntr_data) mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); byte_cntr_data->enable = false; byte_cntr_data->enable = false; byte_cntr_data->read_active = false; wake_up(&byte_cntr_data->wq); coresight_csr_set_byte_cntr(byte_cntr_data->csr, 0); coresight_csr_set_byte_cntr(byte_cntr_data->csr, 0); mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); Loading Loading @@ -214,7 +230,7 @@ static int tmc_etr_byte_cntr_open(struct inode *in, struct file *fp) mutex_lock(&byte_cntr_data->byte_cntr_lock); mutex_lock(&byte_cntr_data->byte_cntr_lock); if (!tmcdrvdata->enable || !byte_cntr_data->block_size) { if (!byte_cntr_data->enable || !byte_cntr_data->block_size) { mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return -EINVAL; return -EINVAL; } } Loading @@ -227,10 +243,8 @@ static int tmc_etr_byte_cntr_open(struct inode *in, struct file *fp) fp->private_data = byte_cntr_data; fp->private_data = byte_cntr_data; nonseekable_open(in, fp); nonseekable_open(in, fp); byte_cntr_data->enable = true; byte_cntr_data->read_active = true; byte_cntr_data->read_active = true; mutex_unlock(&byte_cntr_data->byte_cntr_lock); mutex_unlock(&byte_cntr_data->byte_cntr_lock); return 0; return 0; } } Loading