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 --- |