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

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
...@@ -194,8 +194,10 @@ unsigned int comedi_buf_write_alloc(struct comedi_async *async, ...@@ -194,8 +194,10 @@ unsigned int comedi_buf_write_alloc(struct comedi_async *async,
} }
EXPORT_SYMBOL(comedi_buf_write_alloc); 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, static unsigned int comedi_buf_munge(struct comedi_async *async,
unsigned int num_bytes) unsigned int num_bytes)
{ {
...@@ -203,32 +205,36 @@ static unsigned int comedi_buf_munge(struct comedi_async *async, ...@@ -203,32 +205,36 @@ static unsigned int comedi_buf_munge(struct comedi_async *async,
unsigned int count = 0; unsigned int count = 0;
const unsigned num_sample_bytes = bytes_per_sample(s); 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; async->munge_count += num_bytes;
BUG_ON((int)(async->munge_count - async->buf_write_count) > 0); count = num_bytes;
return num_bytes; } else {
}
/* don't munge partial samples */ /* don't munge partial samples */
num_bytes -= num_bytes % num_sample_bytes; num_bytes -= num_bytes % num_sample_bytes;
while (count < num_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) { if (block_size < 0) {
dev_warn(s->device->class_dev, dev_warn(s->device->class_dev,
"%s: %s: bug! block_size is negative\n", "%s: %s: bug! block_size is negative\n",
__FILE__, __func__); __FILE__, __func__);
break; 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); 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 += block_size / num_sample_bytes;
async->munge_chan %= async->cmd.chanlist_len; async->munge_chan %= async->cmd.chanlist_len;
...@@ -237,6 +243,8 @@ static unsigned int comedi_buf_munge(struct comedi_async *async, ...@@ -237,6 +243,8 @@ static unsigned int comedi_buf_munge(struct comedi_async *async,
async->munge_ptr %= async->prealloc_bufsz; async->munge_ptr %= async->prealloc_bufsz;
count += block_size; count += block_size;
} }
}
BUG_ON((int)(async->munge_count - async->buf_write_count) > 0); BUG_ON((int)(async->munge_count - async->buf_write_count) > 0);
return count; return count;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment