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

Commit 8d4be669 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: comedi_buf: cleanup comedi_buf_munge()



Refactor this function so there is a single return point and only
one BUG_ON check. The BUG_ON needs to be looked at to see if it
can be safely removed.

Clarify the test in the munge loop that checks for a block copy
that would extend pass the end of the prealloc_buf.

Reword the comment about the need for the smp_wmb().

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 47181eab
Loading
Loading
Loading
Loading
+41 −33
Original line number Diff line number Diff line
@@ -194,8 +194,10 @@ unsigned int comedi_buf_write_alloc(struct comedi_async *async,
}
EXPORT_SYMBOL(comedi_buf_write_alloc);

/* munging is applied to data by core as it passes between user
 * and kernel space */
/*
 * munging is applied to data by core as it passes between user
 * and kernel space
 */
static unsigned int comedi_buf_munge(struct comedi_async *async,
				     unsigned int num_bytes)
{
@@ -203,32 +205,36 @@ static unsigned int comedi_buf_munge(struct comedi_async *async,
	unsigned int count = 0;
	const unsigned num_sample_bytes = bytes_per_sample(s);

	if (s->munge == NULL || (async->cmd.flags & CMDF_RAWDATA)) {
	if (!s->munge || (async->cmd.flags & CMDF_RAWDATA)) {
		async->munge_count += num_bytes;
		BUG_ON((int)(async->munge_count - async->buf_write_count) > 0);
		return num_bytes;
	}
		count = num_bytes;
	} else {
		/* don't munge partial samples */
		num_bytes -= num_bytes % num_sample_bytes;
		while (count < num_bytes) {
		int block_size;
			int block_size = num_bytes - count;
			unsigned int buf_end;

		block_size = num_bytes - count;
			if (block_size < 0) {
				dev_warn(s->device->class_dev,
					"%s: %s: bug! block_size is negative\n",
					__FILE__, __func__);
				break;
			}
		if ((int)(async->munge_ptr + block_size -
			  async->prealloc_bufsz) > 0)
			block_size = async->prealloc_bufsz - async->munge_ptr;

		s->munge(s->device, s, async->prealloc_buf + async->munge_ptr,
			buf_end = async->prealloc_bufsz - async->munge_ptr;
			if (block_size > buf_end)
				block_size = buf_end;

			s->munge(s->device, s,
				 async->prealloc_buf + async->munge_ptr,
				 block_size, async->munge_chan);

		smp_wmb();	/* barrier insures data is munged in buffer
				 * before munge_count is incremented */
			/*
			 * ensure data is munged in buffer before the
			 * async buffer munge_count is incremented
			 */
			smp_wmb();

			async->munge_chan += block_size / num_sample_bytes;
			async->munge_chan %= async->cmd.chanlist_len;
@@ -237,6 +243,8 @@ static unsigned int comedi_buf_munge(struct comedi_async *async,
			async->munge_ptr %= async->prealloc_bufsz;
			count += block_size;
		}
	}

	BUG_ON((int)(async->munge_count - async->buf_write_count) > 0);
	return count;
}