Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 92733
b: refs/heads/master
c: a095be4
h: refs/heads/master
i:
  92731: 1be2fe5
v: v3
  • Loading branch information
Andrea Odetti authored and Mauro Carvalho Chehab committed Apr 24, 2008
1 parent 0d58684 commit e476ef5
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 48c01a9c2d245b229f8b709040cb1776b00dc683
refs/heads/master: a095be4b030cd7eb5ac2a7dcb86e803db149a8db
63 changes: 49 additions & 14 deletions trunk/drivers/media/dvb/dvb-core/dmxdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,39 @@ static ssize_t dvb_dvr_read(struct file *file, char __user *buf, size_t count,
return ret;
}

static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev,
unsigned long size)
{
struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer;
void *newmem;
void *oldmem;

dprintk("function : %s\n", __func__);

if (buf->size == size)
return 0;
if (!size)
return -EINVAL;

newmem = vmalloc(size);
if (!newmem)
return -ENOMEM;

oldmem = buf->data;

spin_lock_irq(&dmxdev->lock);
buf->data = newmem;
buf->size = size;

/* reset and not flush in case the buffer shrinks */
dvb_ringbuffer_reset(buf);
spin_unlock_irq(&dmxdev->lock);

vfree(oldmem);

return 0;
}

static inline void dvb_dmxdev_filter_state_set(struct dmxdev_filter
*dmxdevfilter, int state)
{
Expand All @@ -271,30 +304,32 @@ static int dvb_dmxdev_set_buffer_size(struct dmxdev_filter *dmxdevfilter,
unsigned long size)
{
struct dvb_ringbuffer *buf = &dmxdevfilter->buffer;
void *mem;
void *newmem;
void *oldmem;

if (buf->size == size)
return 0;
if (!size)
return -EINVAL;
if (dmxdevfilter->state >= DMXDEV_STATE_GO)
return -EBUSY;

newmem = vmalloc(size);
if (!newmem)
return -ENOMEM;

oldmem = buf->data;

spin_lock_irq(&dmxdevfilter->dev->lock);
mem = buf->data;
buf->data = NULL;
buf->data = newmem;
buf->size = size;

/* reset and not flush in case the buffer shrinks */
dvb_ringbuffer_reset(buf);
spin_unlock_irq(&dmxdevfilter->dev->lock);
vfree(mem);

if (buf->size) {
mem = vmalloc(dmxdevfilter->buffer.size);
if (!mem)
return -ENOMEM;
spin_lock_irq(&dmxdevfilter->dev->lock);
buf->data = mem;
spin_unlock_irq(&dmxdevfilter->dev->lock);
}
vfree(oldmem);

return 0;
}

Expand Down Expand Up @@ -1011,15 +1046,15 @@ static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file,
{
struct dvb_device *dvbdev = file->private_data;
struct dmxdev *dmxdev = dvbdev->priv;
unsigned long arg = (unsigned long)parg;
int ret;

if (mutex_lock_interruptible(&dmxdev->mutex))
return -ERESTARTSYS;

switch (cmd) {
case DMX_SET_BUFFER_SIZE:
// FIXME: implement
ret = 0;
ret = dvb_dvr_set_buffer_size(dmxdev, arg);
break;

default:
Expand Down

0 comments on commit e476ef5

Please sign in to comment.