[linux-dvb] Re: SAA7146 DMA buffer overflow

Johannes Stezenbach js at linuxtv.org
Sun Feb 19 13:14:11 CET 2006


On Sat, Feb 18, 2006, Ingo Schneider wrote:
>  int budget_debug;
> +int budget_buffer_size;

how about budget_dma_buffer_size?
make it static

>  	if (newdma > olddma) {	/* no wraparound, dump olddma..newdma */
>  		dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (newdma - olddma) / 188);
> +		count = newdma - olddma;
>  	} else {		/* wraparound, dump olddma..buflen and 0..newdma */
> -		dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (TS_BUFLEN - olddma) / 188);
> +		dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (budget->buffer_size - olddma) / 188);
>  		dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188);
> +		count = budget->buffer_size - olddma + newdma;
> +	}

what about this common subexpression thing which Oliver suggested?
this would also avoid lines longer than 80 characters...

> +	
> +	

trailing whitespace

> +	if (count > (budget->buffer_size * 80/100)) {
> +		budget->buffer_warnings++;
> +		if (budget->buffer_warnings < 100 || budget->buffer_warnings % 100 == 0) {
> +			printk("ttpci vpeirq: warning: used %d times more than 80 percent of buffer (%d bytes now)\n", budget->buffer_warnings, count);

this begs for a line break

could printk_ratelimit() be used here?

> +		budget->buffer_height = TS_DEFAULT_HEIGHT*2;

TS_DEFAULT_HEIGHT * 2

> +	

more trailing whitespace

> +	if (budget_buffer_size >= TS_MIN_BUFSIZE_K && budget_buffer_size <= TS_MAX_BUFSIZE_K) {
> +		int bufsize = budget_buffer_size * 1024;
> +		
> +		// For activy, don't change the buffer width at all, since it must stay at TS_SIZE
> +		// For all other cards, only change the width of the buffer if the requested buffer size cannot be realized 
> +		// by changing only the height of buffer
> +		if (bufsize / budget->buffer_width > TS_MAX_HEIGHT && budget->card->type != BUDGET_FS_ACTIVY)
> +			budget->buffer_width = budget_mod_limit(bufsize/TS_MAX_HEIGHT, TS_MOD_WIDTH, TS_MAX_WIDTH);
> +
> +		budget->buffer_height = budget_mod_limit(bufsize/budget->buffer_width, TS_MOD_HEIGHT, TS_MAX_HEIGHT);

add some line breaks (I'd also prefer /* */ style block comments...)

> +EXPORT_SYMBOL_GPL(budget_buffer_size);

don't export

> +extern int budget_buffer_size;

don't

> -#define TS_WIDTH  (376)
> -#define TS_HEIGHT (512)
> -#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
> -#define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
> +#define TS_DEFAULT_WIDTH 376
> +#define TS_DEFAULT_HEIGHT 512
> +#define TS_MOD_WIDTH 376         // 2 * TS_SIZE (% 8 == 0)
> +#define TS_MOD_HEIGHT 256        // 0x0100
> +#define TS_MAX_WIDTH 3760        // 10 * (2*TS_SIZE)
> +#define TS_MAX_HEIGHT 3840       // 0x0f00
> +
> +#define TS_MIN_BUFSIZE_K 188
> +#define TS_MAX_BUFSIZE_K 4096    // spec says SAA7146 can handle at most 4 MB DMA and this is known to work

private #defines should be in budget-core.c, only stuff meant
for budget-core users should be in budget.h

Your Signed-off-by: is also required, and please include
better patch description as I said in my other mail.

Maybe Oliver can pick it up after you addressed these issues.


Thanks,
Johannes



More information about the linux-dvb mailing list