/******************************************************************************/
/* Light-weight trace
* Support for temporary event tracing with minimal Heisenberg effect. */
-#define LWT_SUPPORT 1
+#define LWT_SUPPORT 0
+
+#define LWT_MEMORY (64<<20)
+#define LWT_MAX_CPUS 4
typedef struct {
cycles_t lwte_when;
extern int lwt_lookup_string (int *size, char *knlptr,
char *usrptr, int usrsize);
extern int lwt_control (int enable, int clear);
-extern int lwt_snapshot (int *ncpu, int *total_size,
+extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size,
void *user_ptr, int user_size);
/* Note that we _don't_ define LWT_EVENT at all if LWT_SUPPORT isn't set.
break;
case IOC_PORTAL_LWT_SNAPSHOT:
- err = lwt_snapshot (&data->ioc_count, &data->ioc_misc,
+ err = lwt_snapshot (&data->ioc_nid,
+ &data->ioc_count, &data->ioc_misc,
data->ioc_pbuf1, data->ioc_plen1);
if (err == 0 &&
copy_to_user((char *)arg, data, sizeof (*data)))
}
static int
-lwt_snapshot(int *ncpu, int *totalsize, lwt_event_t *events, int size)
+lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize,
+ lwt_event_t *events, int size)
{
struct portal_ioctl_data data;
int rc;
LASSERT (data.ioc_count != 0);
LASSERT (data.ioc_misc != 0);
+ if (now != NULL)
+ *now = data.ioc_nid;
+
if (ncpu != NULL)
*ncpu = data.ioc_count;
int
jt_ptl_lwt(int argc, char **argv)
{
-#define MAX_CPUS 8
int ncpus;
int totalspace;
int nevents_per_cpu;
lwt_event_t *events;
- lwt_event_t *cpu_event[MAX_CPUS + 1];
- lwt_event_t *next_event[MAX_CPUS];
- lwt_event_t *first_event[MAX_CPUS];
+ lwt_event_t *cpu_event[LWT_MAX_CPUS + 1];
+ lwt_event_t *next_event[LWT_MAX_CPUS];
+ lwt_event_t *first_event[LWT_MAX_CPUS];
int cpu;
lwt_event_t *e;
int rc;
double mhz;
cycles_t t0;
cycles_t tlast;
+ cycles_t tnow;
+ struct timeval tvnow;
+ int printed_date = 0;
FILE *f = stdout;
if (argc < 2 ||
return (0);
}
- if (lwt_snapshot(&ncpus, &totalspace, NULL, 0) != 0)
+ if (lwt_snapshot(NULL, &ncpus, &totalspace, NULL, 0) != 0)
return (-1);
- if (ncpus > MAX_CPUS) {
- fprintf(stderr, "Too many cpus: %d (%d)\n", ncpus, MAX_CPUS);
+ if (ncpus > LWT_MAX_CPUS) {
+ fprintf(stderr, "Too many cpus: %d (%d)\n",
+ ncpus, LWT_MAX_CPUS);
return (-1);
}
return (-1);
}
- if (lwt_snapshot(NULL, NULL, events, totalspace)) {
+ if (lwt_snapshot(&tnow, NULL, NULL, events, totalspace)) {
free(events);
return (-1);
}
+ /* we want this time to be sampled at snapshot time */
+ gettimeofday(&tvnow, NULL);
+
if (argc > 2) {
f = fopen (argv[2], "w");
if (f == NULL) {
if (t0 <= next_event[cpu]->lwte_when) {
/* on or after the first event */
+ if (!printed_date) {
+ cycles_t du = (tnow - t0) / mhz;
+ time_t then = tvnow.tv_sec - du/1000000;
+
+ if (du % 1000000 > tvnow.tv_usec)
+ then--;
+
+ fprintf(f, "%s", ctime(&then));
+ printed_date = 1;
+ }
+
rc = lwt_print(f, t0, tlast, mhz, cpu, next_event[cpu]);
if (rc != 0)
break;
free(events);
return (0);
-#undef MAX_CPUS
}
/******************************************************************************/
/* Light-weight trace
* Support for temporary event tracing with minimal Heisenberg effect. */
-#define LWT_SUPPORT 1
+#define LWT_SUPPORT 0
+
+#define LWT_MEMORY (64<<20)
+#define LWT_MAX_CPUS 4
typedef struct {
cycles_t lwte_when;
extern int lwt_lookup_string (int *size, char *knlptr,
char *usrptr, int usrsize);
extern int lwt_control (int enable, int clear);
-extern int lwt_snapshot (int *ncpu, int *total_size,
+extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size,
void *user_ptr, int user_size);
/* Note that we _don't_ define LWT_EVENT at all if LWT_SUPPORT isn't set.
break;
case IOC_PORTAL_LWT_SNAPSHOT:
- err = lwt_snapshot (&data->ioc_count, &data->ioc_misc,
+ err = lwt_snapshot (&data->ioc_nid,
+ &data->ioc_count, &data->ioc_misc,
data->ioc_pbuf1, data->ioc_plen1);
if (err == 0 &&
copy_to_user((char *)arg, data, sizeof (*data)))
}
static int
-lwt_snapshot(int *ncpu, int *totalsize, lwt_event_t *events, int size)
+lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize,
+ lwt_event_t *events, int size)
{
struct portal_ioctl_data data;
int rc;
LASSERT (data.ioc_count != 0);
LASSERT (data.ioc_misc != 0);
+ if (now != NULL)
+ *now = data.ioc_nid;
+
if (ncpu != NULL)
*ncpu = data.ioc_count;
int
jt_ptl_lwt(int argc, char **argv)
{
-#define MAX_CPUS 8
int ncpus;
int totalspace;
int nevents_per_cpu;
lwt_event_t *events;
- lwt_event_t *cpu_event[MAX_CPUS + 1];
- lwt_event_t *next_event[MAX_CPUS];
- lwt_event_t *first_event[MAX_CPUS];
+ lwt_event_t *cpu_event[LWT_MAX_CPUS + 1];
+ lwt_event_t *next_event[LWT_MAX_CPUS];
+ lwt_event_t *first_event[LWT_MAX_CPUS];
int cpu;
lwt_event_t *e;
int rc;
double mhz;
cycles_t t0;
cycles_t tlast;
+ cycles_t tnow;
+ struct timeval tvnow;
+ int printed_date = 0;
FILE *f = stdout;
if (argc < 2 ||
return (0);
}
- if (lwt_snapshot(&ncpus, &totalspace, NULL, 0) != 0)
+ if (lwt_snapshot(NULL, &ncpus, &totalspace, NULL, 0) != 0)
return (-1);
- if (ncpus > MAX_CPUS) {
- fprintf(stderr, "Too many cpus: %d (%d)\n", ncpus, MAX_CPUS);
+ if (ncpus > LWT_MAX_CPUS) {
+ fprintf(stderr, "Too many cpus: %d (%d)\n",
+ ncpus, LWT_MAX_CPUS);
return (-1);
}
return (-1);
}
- if (lwt_snapshot(NULL, NULL, events, totalspace)) {
+ if (lwt_snapshot(&tnow, NULL, NULL, events, totalspace)) {
free(events);
return (-1);
}
+ /* we want this time to be sampled at snapshot time */
+ gettimeofday(&tvnow, NULL);
+
if (argc > 2) {
f = fopen (argv[2], "w");
if (f == NULL) {
if (t0 <= next_event[cpu]->lwte_when) {
/* on or after the first event */
+ if (!printed_date) {
+ cycles_t du = (tnow - t0) / mhz;
+ time_t then = tvnow.tv_sec - du/1000000;
+
+ if (du % 1000000 > tvnow.tv_usec)
+ then--;
+
+ fprintf(f, "%s", ctime(&then));
+ printed_date = 1;
+ }
+
rc = lwt_print(f, t0, tlast, mhz, cpu, next_event[cpu]);
if (rc != 0)
break;
free(events);
return (0);
-#undef MAX_CPUS
}