static void salinfo_timeout (unsigned long arg) { ia64_mlogbuf_dump(); salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_MCA); salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_INIT); salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY; add_timer(&salinfo_timer); }
static void salinfo_timeout(struct timer_list *unused) { ia64_mlogbuf_dump(); salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_MCA); salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_INIT); salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY; add_timer(&salinfo_timer); }
static ssize_t salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) { struct inode *inode = file->f_path.dentry->d_inode; struct proc_dir_entry *entry = PDE(inode); struct salinfo_data *data = entry->data; char cmd[32]; size_t size; int i, n, cpu = -1; retry: if (cpus_empty(data->cpu_event) && down_trylock(&data->mutex)) { if (file->f_flags & O_NONBLOCK) return -EAGAIN; if (down_interruptible(&data->mutex)) return -EINTR; } n = data->cpu_check; for (i = 0; i < NR_CPUS; i++) { if (cpu_isset(n, data->cpu_event)) { if (!cpu_online(n)) { cpu_clear(n, data->cpu_event); continue; } cpu = n; break; } if (++n == NR_CPUS) n = 0; } if (cpu == -1) goto retry; ia64_mlogbuf_dump(); /* for next read, start checking at next CPU */ data->cpu_check = cpu; if (++data->cpu_check == NR_CPUS) data->cpu_check = 0; snprintf(cmd, sizeof(cmd), "read %d\n", cpu); size = strlen(cmd); if (size > count) size = count; if (copy_to_user(buffer, cmd, size)) return -EFAULT; return size; }
static ssize_t salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) { struct salinfo_data *data = PDE_DATA(file_inode(file)); char cmd[32]; size_t size; int i, n, cpu = -1; retry: if (cpumask_empty(&data->cpu_event)) { if (file->f_flags & O_NONBLOCK) return -EAGAIN; if (wait_event_interruptible(data->read_wait, !cpumask_empty(&data->cpu_event))) return -EINTR; } n = data->cpu_check; for (i = 0; i < nr_cpu_ids; i++) { if (cpumask_test_cpu(n, &data->cpu_event)) { if (!cpu_online(n)) { cpumask_clear_cpu(n, &data->cpu_event); continue; } cpu = n; break; } if (++n == nr_cpu_ids) n = 0; } if (cpu == -1) goto retry; ia64_mlogbuf_dump(); /* for next read, start checking at next CPU */ data->cpu_check = cpu; if (++data->cpu_check == nr_cpu_ids) data->cpu_check = 0; snprintf(cmd, sizeof(cmd), "read %d\n", cpu); size = strlen(cmd); if (size > count) size = count; if (copy_to_user(buffer, cmd, size)) return -EFAULT; return size; }