#if LWT_SUPPORT
+#if !KLWT_SUPPORT
int lwt_enabled;
+lwt_cpu_t lwt_cpus[NR_CPUS];
+#endif
+
int lwt_pages_per_cpu;
-lwt_cpu_t lwt_cpus[LWT_MAX_CPUS];
/* NB only root is allowed to retrieve LWT info; it's an open door into the
* kernel... */
if (!capable(CAP_SYS_ADMIN))
return (-EPERM);
- if (clear)
- for (i = 0; i < num_online_cpus(); i++) {
- p = lwt_cpus[i].lwtc_current_page;
+ if (!enable) {
+ LWT_EVENT(0,0,0,0);
+ lwt_enabled = 0;
+ mb();
+ /* give people some time to stop adding traces */
+ schedule_timeout(10);
+ }
- for (j = 0; j < lwt_pages_per_cpu; j++) {
- memset (p->lwtp_events, 0, PAGE_SIZE);
+ for (i = 0; i < num_online_cpus(); i++) {
+ p = lwt_cpus[i].lwtc_current_page;
- p = list_entry (p->lwtp_list.next,
- lwt_page_t, lwtp_list);
- }
+ if (p == NULL)
+ return (-ENODATA);
+
+ if (!clear)
+ continue;
+
+ for (j = 0; j < lwt_pages_per_cpu; j++) {
+ memset (p->lwtp_events, 0, PAGE_SIZE);
+
+ p = list_entry (p->lwtp_list.next,
+ lwt_page_t, lwtp_list);
+ }
}
- lwt_enabled = enable;
- mb();
- if (!enable) {
- /* give people some time to stop adding traces */
- schedule_timeout(10);
+ if (enable) {
+ lwt_enabled = 1;
+ mb();
+ LWT_EVENT(0,0,0,0);
}
return (0);
for (i = 0; i < num_online_cpus(); i++) {
p = lwt_cpus[i].lwtc_current_page;
+
+ if (p == NULL)
+ return (-ENODATA);
for (j = 0; j < lwt_pages_per_cpu; j++) {
if (copy_to_user(user_ptr, p->lwtp_events,
{
int i;
int j;
+
+ for (i = 0; i < num_online_cpus(); i++)
+ if (lwt_cpus[i].lwtc_current_page != NULL)
+ return (-EALREADY);
- if (num_online_cpus() > LWT_MAX_CPUS) {
- CERROR ("Too many CPUs\n");
- return (-EINVAL);
- }
+ LASSERT (!lwt_enabled);
/* NULL pointers, zero scalars */
memset (lwt_cpus, 0, sizeof (lwt_cpus));
lwt_enabled = 1;
mb();
+ LWT_EVENT(0,0,0,0);
+
return (0);
}
lwt_fini ()
{
int i;
-
- if (num_online_cpus() > LWT_MAX_CPUS)
- return;
+ lwt_control(0, 0);
+
for (i = 0; i < num_online_cpus(); i++)
while (lwt_cpus[i].lwtc_current_page != NULL) {
lwt_page_t *lwtp = lwt_cpus[i].lwtc_current_page;