Commit 30ee59d7 authored by David Mosberger's avatar David Mosberger

ia64: fix perfmon bug causing lost samples

	Patch from Stephane: Fix a bug in perfmon_default_smpl.c by
	which we would systematically lose one sample at every buffer
	overflow.
parent 2be2f0ae
...@@ -114,7 +114,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -114,7 +114,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
pfm_default_smpl_hdr_t *hdr; pfm_default_smpl_hdr_t *hdr;
pfm_default_smpl_entry_t *ent; pfm_default_smpl_entry_t *ent;
void *cur, *last; void *cur, *last;
unsigned long *e; unsigned long *e, entry_size;
unsigned int npmds, i; unsigned int npmds, i;
unsigned char ovfl_pmd; unsigned char ovfl_pmd;
unsigned char ovfl_notify; unsigned char ovfl_notify;
...@@ -131,8 +131,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -131,8 +131,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
ovfl_notify = arg->ovfl_notify; ovfl_notify = arg->ovfl_notify;
/* /*
* check for space against largest possibly entry. * precheck for sanity
* We may waste space at the end of the buffer.
*/ */
if ((last - cur) < PFM_DEFAULT_MAX_ENTRY_SIZE) goto full; if ((last - cur) < PFM_DEFAULT_MAX_ENTRY_SIZE) goto full;
...@@ -142,6 +141,8 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -142,6 +141,8 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
prefetch(arg->smpl_pmds_values); prefetch(arg->smpl_pmds_values);
entry_size = sizeof(*ent) + (npmds << 3);
/* position for first pmd */ /* position for first pmd */
e = (unsigned long *)(ent+1); e = (unsigned long *)(ent+1);
...@@ -191,7 +192,13 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -191,7 +192,13 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
/* /*
* update position for next entry * update position for next entry
*/ */
hdr->hdr_cur_offs += sizeof(*ent) + (npmds << 3); hdr->hdr_cur_offs += entry_size;
cur += entry_size;
/*
* post check to avoid losing the last sample
*/
if ((last - cur) < PFM_DEFAULT_MAX_ENTRY_SIZE) goto full;
/* /*
* keep same ovfl_pmds, ovfl_notify * keep same ovfl_pmds, ovfl_notify
......
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