From: Philippe E. <ph...@us...> - 2003-04-05 20:22:58
|
Update of /cvsroot/oprofile/oprofile/module In directory sc8-pr-cvs1:/tmp/cvs-serv1179/module Modified Files: oprofile.c oprofile.h Log Message: 2.4 module: make watermark proprotionnal to buffer size. With this patch I no longer see module buffer overflow at rate=6000 on UP using --buffer-size=262144. I can see rare buffer overflow when using two counter at count 6000 and 6001 (25000 samples lost on 6.0E6 samples) but only with load average > 5 John, can you setup test on SMP ? regards, Phil Index: oprofile.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/oprofile.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- oprofile.c 26 Mar 2003 19:31:21 -0000 1.80 +++ oprofile.c 5 Apr 2003 20:22:55 -0000 1.81 @@ -57,7 +57,7 @@ inline static int need_wakeup(uint cpu, struct _oprof_data * data) { - return data->nextbuf >= (data->buf_size - OP_PRE_WATERMARK) && !oprof_ready[cpu]; + return data->nextbuf >= (data->buf_size - data->buf_watermark) && !oprof_ready[cpu]; } inline static void next_sample(struct _oprof_data * data) @@ -160,7 +160,7 @@ inline static void up_and_check_note(void) { note_pos++; - if (likely(note_pos < (sysctl.note_size - OP_PRE_NOTE_WATERMARK) && !is_ready())) + if (likely(note_pos < (sysctl.note_size - OP_PRE_NOTE_WATERMARK(sysctl.note_size)) && !is_ready())) return; /* if we reach the end of the buffer, just pin @@ -255,9 +255,11 @@ struct _oprof_data * data = &oprof_data[cpu_nr]; int size = data->buf_size; int num = data->nextbuf; - if (num < size - OP_PRE_WATERMARK && oprof_ready[cpu_nr] != 2) { - printk(KERN_WARNING "oprofile: Detected overflow of size %d. You must increase " - "the hash table size or reduce the interrupt frequency\n", num); + if (num < size - data->buf_watermark && oprof_ready[cpu_nr] != 2) { + printk(KERN_WARNING "oprofile: Detected overflow of size %d. " + "You must increase the module buffer size with\n" + "opcontrol --setup --bufer-size= or reduce the " + "interrupt frequency\n", num); num = size; } else data->nextbuf = 0; @@ -441,6 +443,7 @@ data = &oprof_data[i]; data->buf_size = 0; data->buffer = 0; + data->buf_watermark = 0; } buf_size = (sizeof(struct op_sample) * sysctl.buf_size); @@ -458,6 +461,7 @@ memset(data->buffer, 0, buf_size); data->buf_size = sysctl.buf_size; + data->buf_watermark = OP_PRE_WATERMARK(data->buf_size); data->nextbuf = 0; } @@ -468,10 +472,10 @@ { int err; - if ((err = check_range(sysctl.buf_size, OP_PRE_WATERMARK + 1024, 1048576, + if ((err = check_range(sysctl.buf_size, OP_MIN_BUF_SIZE, OP_MAX_BUF_SIZE, "sysctl.buf_size value %d not in range (%d %d)\n"))) return err; - if ((err = check_range(sysctl.note_size, OP_PRE_NOTE_WATERMARK + 1024, 1048576, + if ((err = check_range(sysctl.note_size, OP_MIN_NOTE_TABLE_SIZE, OP_MAX_NOTE_TABLE_SIZE, "sysctl.note_size value %d not in range (%d %d)\n"))) return err; Index: oprofile.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/oprofile.h,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- oprofile.h 26 Mar 2003 19:31:22 -0000 1.45 +++ oprofile.h 5 Apr 2003 20:22:55 -0000 1.46 @@ -44,6 +44,8 @@ struct op_sample * buffer; /* nr. in buffer */ uint buf_size; + /* we try to wakeup when nextbuf >= buf_watermark */ + uint buf_watermark; /* next in buffer (atomic) */ uint nextbuf; /* number of IRQs for this CPU */ |