salinfo.c (f01387d2693813eb5271a3448e6a082322c7d75d) salinfo.c (5d2068da8d339e4dff8f9b9a1246e6a79e2949d8)
1/*
2 * salinfo.c
3 *
4 * Creates entries in /proc/sal for various system features.
5 *
6 * Copyright (c) 2003, 2006 Silicon Graphics, Inc. All rights reserved.
7 * Copyright (c) 2003 Hewlett-Packard Co
8 * Bjorn Helgaas <bjorn.helgaas@hp.com>

--- 242 unchanged lines hidden (view full) ---

251 }
252 if (data_saved) {
253 data_saved->cpu = smp_processor_id();
254 data_saved->id = ((sal_log_record_header_t *)buffer)->id;
255 data_saved->size = size;
256 data_saved->buffer = buffer;
257 }
258 }
1/*
2 * salinfo.c
3 *
4 * Creates entries in /proc/sal for various system features.
5 *
6 * Copyright (c) 2003, 2006 Silicon Graphics, Inc. All rights reserved.
7 * Copyright (c) 2003 Hewlett-Packard Co
8 * Bjorn Helgaas <bjorn.helgaas@hp.com>

--- 242 unchanged lines hidden (view full) ---

251 }
252 if (data_saved) {
253 data_saved->cpu = smp_processor_id();
254 data_saved->id = ((sal_log_record_header_t *)buffer)->id;
255 data_saved->size = size;
256 data_saved->buffer = buffer;
257 }
258 }
259 cpu_set(smp_processor_id(), data->cpu_event);
259 cpumask_set_cpu(smp_processor_id(), &data->cpu_event);
260 if (irqsafe) {
261 salinfo_work_to_do(data);
262 spin_unlock_irqrestore(&data_saved_lock, flags);
263 }
264}
265
266/* Check for outstanding MCA/INIT records every minute (arbitrary) */
267#define SALINFO_TIMER_DELAY (60*HZ)
268static struct timer_list salinfo_timer;
269extern void ia64_mlogbuf_dump(void);
270
271static void
272salinfo_timeout_check(struct salinfo_data *data)
273{
274 unsigned long flags;
275 if (!data->open)
276 return;
260 if (irqsafe) {
261 salinfo_work_to_do(data);
262 spin_unlock_irqrestore(&data_saved_lock, flags);
263 }
264}
265
266/* Check for outstanding MCA/INIT records every minute (arbitrary) */
267#define SALINFO_TIMER_DELAY (60*HZ)
268static struct timer_list salinfo_timer;
269extern void ia64_mlogbuf_dump(void);
270
271static void
272salinfo_timeout_check(struct salinfo_data *data)
273{
274 unsigned long flags;
275 if (!data->open)
276 return;
277 if (!cpus_empty(data->cpu_event)) {
277 if (!cpumask_empty(&data->cpu_event)) {
278 spin_lock_irqsave(&data_saved_lock, flags);
279 salinfo_work_to_do(data);
280 spin_unlock_irqrestore(&data_saved_lock, flags);
281 }
282}
283
284static void
285salinfo_timeout (unsigned long arg)

--- 17 unchanged lines hidden (view full) ---

303salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
304{
305 struct salinfo_data *data = PDE_DATA(file_inode(file));
306 char cmd[32];
307 size_t size;
308 int i, n, cpu = -1;
309
310retry:
278 spin_lock_irqsave(&data_saved_lock, flags);
279 salinfo_work_to_do(data);
280 spin_unlock_irqrestore(&data_saved_lock, flags);
281 }
282}
283
284static void
285salinfo_timeout (unsigned long arg)

--- 17 unchanged lines hidden (view full) ---

303salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
304{
305 struct salinfo_data *data = PDE_DATA(file_inode(file));
306 char cmd[32];
307 size_t size;
308 int i, n, cpu = -1;
309
310retry:
311 if (cpus_empty(data->cpu_event) && down_trylock(&data->mutex)) {
311 if (cpumask_empty(&data->cpu_event) && down_trylock(&data->mutex)) {
312 if (file->f_flags & O_NONBLOCK)
313 return -EAGAIN;
314 if (down_interruptible(&data->mutex))
315 return -EINTR;
316 }
317
318 n = data->cpu_check;
319 for (i = 0; i < nr_cpu_ids; i++) {
312 if (file->f_flags & O_NONBLOCK)
313 return -EAGAIN;
314 if (down_interruptible(&data->mutex))
315 return -EINTR;
316 }
317
318 n = data->cpu_check;
319 for (i = 0; i < nr_cpu_ids; i++) {
320 if (cpu_isset(n, data->cpu_event)) {
320 if (cpumask_test_cpu(n, &data->cpu_event)) {
321 if (!cpu_online(n)) {
321 if (!cpu_online(n)) {
322 cpu_clear(n, data->cpu_event);
322 cpumask_clear_cpu(n, &data->cpu_event);
323 continue;
324 }
325 cpu = n;
326 break;
327 }
328 if (++n == nr_cpu_ids)
329 n = 0;
330 }

--- 115 unchanged lines hidden (view full) ---

446 }
447 }
448 spin_unlock_irqrestore(&data_saved_lock, flags);
449
450 if (!data->saved_num)
451 call_on_cpu(cpu, salinfo_log_read_cpu, data);
452 if (!data->log_size) {
453 data->state = STATE_NO_DATA;
323 continue;
324 }
325 cpu = n;
326 break;
327 }
328 if (++n == nr_cpu_ids)
329 n = 0;
330 }

--- 115 unchanged lines hidden (view full) ---

446 }
447 }
448 spin_unlock_irqrestore(&data_saved_lock, flags);
449
450 if (!data->saved_num)
451 call_on_cpu(cpu, salinfo_log_read_cpu, data);
452 if (!data->log_size) {
453 data->state = STATE_NO_DATA;
454 cpu_clear(cpu, data->cpu_event);
454 cpumask_clear_cpu(cpu, &data->cpu_event);
455 } else {
456 data->state = STATE_LOG_RECORD;
457 }
458}
459
460static ssize_t
461salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
462{

--- 23 unchanged lines hidden (view full) ---

486
487static int
488salinfo_log_clear(struct salinfo_data *data, int cpu)
489{
490 sal_log_record_header_t *rh;
491 unsigned long flags;
492 spin_lock_irqsave(&data_saved_lock, flags);
493 data->state = STATE_NO_DATA;
455 } else {
456 data->state = STATE_LOG_RECORD;
457 }
458}
459
460static ssize_t
461salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
462{

--- 23 unchanged lines hidden (view full) ---

486
487static int
488salinfo_log_clear(struct salinfo_data *data, int cpu)
489{
490 sal_log_record_header_t *rh;
491 unsigned long flags;
492 spin_lock_irqsave(&data_saved_lock, flags);
493 data->state = STATE_NO_DATA;
494 if (!cpu_isset(cpu, data->cpu_event)) {
494 if (!cpumask_test_cpu(cpu, &data->cpu_event)) {
495 spin_unlock_irqrestore(&data_saved_lock, flags);
496 return 0;
497 }
495 spin_unlock_irqrestore(&data_saved_lock, flags);
496 return 0;
497 }
498 cpu_clear(cpu, data->cpu_event);
498 cpumask_clear_cpu(cpu, &data->cpu_event);
499 if (data->saved_num) {
500 shift1_data_saved(data, data->saved_num - 1);
501 data->saved_num = 0;
502 }
503 spin_unlock_irqrestore(&data_saved_lock, flags);
504 rh = (sal_log_record_header_t *)(data->log_buffer);
505 /* Corrected errors have already been cleared from SAL */
506 if (rh->severity != sal_log_severity_corrected)
507 call_on_cpu(cpu, salinfo_log_clear_cpu, data);
508 /* clearing a record may make a new record visible */
509 salinfo_log_new_read(cpu, data);
510 if (data->state == STATE_LOG_RECORD) {
511 spin_lock_irqsave(&data_saved_lock, flags);
499 if (data->saved_num) {
500 shift1_data_saved(data, data->saved_num - 1);
501 data->saved_num = 0;
502 }
503 spin_unlock_irqrestore(&data_saved_lock, flags);
504 rh = (sal_log_record_header_t *)(data->log_buffer);
505 /* Corrected errors have already been cleared from SAL */
506 if (rh->severity != sal_log_severity_corrected)
507 call_on_cpu(cpu, salinfo_log_clear_cpu, data);
508 /* clearing a record may make a new record visible */
509 salinfo_log_new_read(cpu, data);
510 if (data->state == STATE_LOG_RECORD) {
511 spin_lock_irqsave(&data_saved_lock, flags);
512 cpu_set(cpu, data->cpu_event);
512 cpumask_set_cpu(cpu, &data->cpu_event);
513 salinfo_work_to_do(data);
514 spin_unlock_irqrestore(&data_saved_lock, flags);
515 }
516 return 0;
517}
518
519static ssize_t
520salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)

--- 55 unchanged lines hidden (view full) ---

576 struct salinfo_data *data;
577 switch (action) {
578 case CPU_ONLINE:
579 case CPU_ONLINE_FROZEN:
580 spin_lock_irqsave(&data_saved_lock, flags);
581 for (i = 0, data = salinfo_data;
582 i < ARRAY_SIZE(salinfo_data);
583 ++i, ++data) {
513 salinfo_work_to_do(data);
514 spin_unlock_irqrestore(&data_saved_lock, flags);
515 }
516 return 0;
517}
518
519static ssize_t
520salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)

--- 55 unchanged lines hidden (view full) ---

576 struct salinfo_data *data;
577 switch (action) {
578 case CPU_ONLINE:
579 case CPU_ONLINE_FROZEN:
580 spin_lock_irqsave(&data_saved_lock, flags);
581 for (i = 0, data = salinfo_data;
582 i < ARRAY_SIZE(salinfo_data);
583 ++i, ++data) {
584 cpu_set(cpu, data->cpu_event);
584 cpumask_set_cpu(cpu, &data->cpu_event);
585 salinfo_work_to_do(data);
586 }
587 spin_unlock_irqrestore(&data_saved_lock, flags);
588 break;
589 case CPU_DEAD:
590 case CPU_DEAD_FROZEN:
591 spin_lock_irqsave(&data_saved_lock, flags);
592 for (i = 0, data = salinfo_data;
593 i < ARRAY_SIZE(salinfo_data);
594 ++i, ++data) {
595 struct salinfo_data_saved *data_saved;
596 int j;
597 for (j = ARRAY_SIZE(data->data_saved) - 1, data_saved = data->data_saved + j;
598 j >= 0;
599 --j, --data_saved) {
600 if (data_saved->buffer && data_saved->cpu == cpu) {
601 shift1_data_saved(data, j);
602 }
603 }
585 salinfo_work_to_do(data);
586 }
587 spin_unlock_irqrestore(&data_saved_lock, flags);
588 break;
589 case CPU_DEAD:
590 case CPU_DEAD_FROZEN:
591 spin_lock_irqsave(&data_saved_lock, flags);
592 for (i = 0, data = salinfo_data;
593 i < ARRAY_SIZE(salinfo_data);
594 ++i, ++data) {
595 struct salinfo_data_saved *data_saved;
596 int j;
597 for (j = ARRAY_SIZE(data->data_saved) - 1, data_saved = data->data_saved + j;
598 j >= 0;
599 --j, --data_saved) {
600 if (data_saved->buffer && data_saved->cpu == cpu) {
601 shift1_data_saved(data, j);
602 }
603 }
604 cpu_clear(cpu, data->cpu_event);
604 cpumask_clear_cpu(cpu, &data->cpu_event);
605 }
606 spin_unlock_irqrestore(&data_saved_lock, flags);
607 break;
608 }
609 return NOTIFY_OK;
610}
611
612static struct notifier_block salinfo_cpu_notifier =

--- 41 unchanged lines hidden (view full) ---

654 entry = proc_create_data("data", S_IRUSR | S_IWUSR, dir,
655 &salinfo_data_fops, data);
656 if (!entry)
657 continue;
658 *sdir++ = entry;
659
660 /* we missed any events before now */
661 for_each_online_cpu(j)
605 }
606 spin_unlock_irqrestore(&data_saved_lock, flags);
607 break;
608 }
609 return NOTIFY_OK;
610}
611
612static struct notifier_block salinfo_cpu_notifier =

--- 41 unchanged lines hidden (view full) ---

654 entry = proc_create_data("data", S_IRUSR | S_IWUSR, dir,
655 &salinfo_data_fops, data);
656 if (!entry)
657 continue;
658 *sdir++ = entry;
659
660 /* we missed any events before now */
661 for_each_online_cpu(j)
662 cpu_set(j, data->cpu_event);
662 cpumask_set_cpu(j, &data->cpu_event);
663
664 *sdir++ = dir;
665 }
666
667 *sdir++ = salinfo_dir;
668
669 init_timer(&salinfo_timer);
670 salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY;

--- 34 unchanged lines hidden ---
663
664 *sdir++ = dir;
665 }
666
667 *sdir++ = salinfo_dir;
668
669 init_timer(&salinfo_timer);
670 salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY;

--- 34 unchanged lines hidden ---