Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6:
[SERIAL] SUNHV: Fix jerky console on LDOM guests.
[SPARC64]: Fix race between MD update and dr-cpu add.
[SPARC64]: SMP build fix.

+154 -160
+144 -134
arch/sparc64/kernel/ds.c
··· 228 228 return NULL; 229 229 } 230 230 231 - static int ds_send(struct ldc_channel *lp, void *data, int len) 231 + static int __ds_send(struct ldc_channel *lp, void *data, int len) 232 232 { 233 233 int err, limit = 1000; 234 234 ··· 239 239 break; 240 240 udelay(1); 241 241 } 242 + 243 + return err; 244 + } 245 + 246 + static int ds_send(struct ldc_channel *lp, void *data, int len) 247 + { 248 + unsigned long flags; 249 + int err; 250 + 251 + spin_lock_irqsave(&ds_lock, flags); 252 + err = __ds_send(lp, data, len); 253 + spin_unlock_irqrestore(&ds_lock, flags); 242 254 243 255 return err; 244 256 } ··· 279 267 280 268 printk(KERN_INFO PFX "Machine description update.\n"); 281 269 270 + mdesc_update(); 271 + 282 272 memset(&pkt, 0, sizeof(pkt)); 283 273 pkt.data.tag.type = DS_DATA; 284 274 pkt.data.tag.len = sizeof(pkt) - sizeof(struct ds_msg_tag); ··· 289 275 pkt.res.result = DS_OK; 290 276 291 277 ds_send(lp, &pkt, sizeof(pkt)); 292 - 293 - mdesc_update(); 294 278 } 295 279 296 280 struct ds_shutdown_req { ··· 403 391 __u32 str_off; 404 392 }; 405 393 406 - /* DR cpu requests get queued onto the work list by the 407 - * dr_cpu_data() callback. The list is protected by 408 - * ds_lock, and processed by dr_cpu_process() in order. 409 - */ 410 - static LIST_HEAD(dr_cpu_work_list); 411 - static DECLARE_WAIT_QUEUE_HEAD(dr_cpu_wait); 412 - 413 - struct dr_cpu_queue_entry { 414 - struct list_head list; 415 - char req[0]; 416 - }; 417 - 418 394 static void __dr_cpu_send_error(struct ds_cap_state *cp, struct ds_data *data) 419 395 { 420 396 struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1); ··· 425 425 426 426 pkt.data.tag.len = msg_len - sizeof(struct ds_msg_tag); 427 427 428 - ds_send(dp->lp, &pkt, msg_len); 428 + __ds_send(dp->lp, &pkt, msg_len); 429 429 } 430 430 431 431 static void dr_cpu_send_error(struct ds_cap_state *cp, struct ds_data *data) ··· 555 555 } 556 556 557 557 spin_lock_irqsave(&ds_lock, flags); 558 - ds_send(ds_info->lp, resp, resp_len); 558 + __ds_send(ds_info->lp, resp, resp_len); 559 559 spin_unlock_irqrestore(&ds_lock, flags); 560 560 561 561 kfree(resp); ··· 596 596 } 597 597 598 598 spin_lock_irqsave(&ds_lock, flags); 599 - ds_send(ds_info->lp, resp, resp_len); 599 + __ds_send(ds_info->lp, resp, resp_len); 600 600 spin_unlock_irqrestore(&ds_lock, flags); 601 601 602 602 kfree(resp); ··· 604 604 return 0; 605 605 } 606 606 607 - static void process_dr_cpu_list(struct ds_cap_state *cp) 608 - { 609 - struct dr_cpu_queue_entry *qp, *tmp; 610 - unsigned long flags; 611 - LIST_HEAD(todo); 612 - cpumask_t mask; 613 - 614 - spin_lock_irqsave(&ds_lock, flags); 615 - list_splice(&dr_cpu_work_list, &todo); 616 - INIT_LIST_HEAD(&dr_cpu_work_list); 617 - spin_unlock_irqrestore(&ds_lock, flags); 618 - 619 - list_for_each_entry_safe(qp, tmp, &todo, list) { 620 - struct ds_data *data = (struct ds_data *) qp->req; 621 - struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1); 622 - u32 *cpu_list = (u32 *) (tag + 1); 623 - u64 req_num = tag->req_num; 624 - unsigned int i; 625 - int err; 626 - 627 - switch (tag->type) { 628 - case DR_CPU_CONFIGURE: 629 - case DR_CPU_UNCONFIGURE: 630 - case DR_CPU_FORCE_UNCONFIGURE: 631 - break; 632 - 633 - default: 634 - dr_cpu_send_error(cp, data); 635 - goto next; 636 - } 637 - 638 - purge_dups(cpu_list, tag->num_records); 639 - 640 - cpus_clear(mask); 641 - for (i = 0; i < tag->num_records; i++) { 642 - if (cpu_list[i] == CPU_SENTINEL) 643 - continue; 644 - 645 - if (cpu_list[i] < NR_CPUS) 646 - cpu_set(cpu_list[i], mask); 647 - } 648 - 649 - if (tag->type == DR_CPU_CONFIGURE) 650 - err = dr_cpu_configure(cp, req_num, &mask); 651 - else 652 - err = dr_cpu_unconfigure(cp, req_num, &mask); 653 - 654 - if (err) 655 - dr_cpu_send_error(cp, data); 656 - 657 - next: 658 - list_del(&qp->list); 659 - kfree(qp); 660 - } 661 - } 662 - 663 - static int dr_cpu_thread(void *__unused) 664 - { 665 - struct ds_cap_state *cp; 666 - DEFINE_WAIT(wait); 667 - 668 - cp = find_cap_by_string("dr-cpu"); 669 - 670 - while (1) { 671 - prepare_to_wait(&dr_cpu_wait, &wait, TASK_INTERRUPTIBLE); 672 - if (list_empty(&dr_cpu_work_list)) 673 - schedule(); 674 - finish_wait(&dr_cpu_wait, &wait); 675 - 676 - if (kthread_should_stop()) 677 - break; 678 - 679 - process_dr_cpu_list(cp); 680 - } 681 - 682 - return 0; 683 - } 684 - 685 607 static void dr_cpu_data(struct ldc_channel *lp, 686 - struct ds_cap_state *dp, 608 + struct ds_cap_state *cp, 687 609 void *buf, int len) 688 610 { 689 - struct dr_cpu_queue_entry *qp; 690 - struct ds_data *dpkt = buf; 691 - struct dr_cpu_tag *rp; 611 + struct ds_data *data = buf; 612 + struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1); 613 + u32 *cpu_list = (u32 *) (tag + 1); 614 + u64 req_num = tag->req_num; 615 + cpumask_t mask; 616 + unsigned int i; 617 + int err; 692 618 693 - rp = (struct dr_cpu_tag *) (dpkt + 1); 619 + switch (tag->type) { 620 + case DR_CPU_CONFIGURE: 621 + case DR_CPU_UNCONFIGURE: 622 + case DR_CPU_FORCE_UNCONFIGURE: 623 + break; 694 624 695 - qp = kmalloc(sizeof(struct dr_cpu_queue_entry) + len, GFP_ATOMIC); 696 - if (!qp) { 697 - struct ds_cap_state *cp; 698 - 699 - cp = find_cap_by_string("dr-cpu"); 700 - __dr_cpu_send_error(cp, dpkt); 701 - } else { 702 - memcpy(&qp->req, buf, len); 703 - list_add_tail(&qp->list, &dr_cpu_work_list); 704 - wake_up(&dr_cpu_wait); 625 + default: 626 + dr_cpu_send_error(cp, data); 627 + return; 705 628 } 629 + 630 + purge_dups(cpu_list, tag->num_records); 631 + 632 + cpus_clear(mask); 633 + for (i = 0; i < tag->num_records; i++) { 634 + if (cpu_list[i] == CPU_SENTINEL) 635 + continue; 636 + 637 + if (cpu_list[i] < NR_CPUS) 638 + cpu_set(cpu_list[i], mask); 639 + } 640 + 641 + if (tag->type == DR_CPU_CONFIGURE) 642 + err = dr_cpu_configure(cp, req_num, &mask); 643 + else 644 + err = dr_cpu_unconfigure(cp, req_num, &mask); 645 + 646 + if (err) 647 + dr_cpu_send_error(cp, data); 706 648 } 707 - #endif 649 + #endif /* CONFIG_HOTPLUG_CPU */ 708 650 709 651 struct ds_pri_msg { 710 652 __u64 req_num; ··· 762 820 ds_var_doorbell = 0; 763 821 ds_var_response = -1; 764 822 765 - ds_send(dp->lp, &pkt, msg_len); 823 + __ds_send(dp->lp, &pkt, msg_len); 766 824 spin_unlock_irqrestore(&ds_lock, flags); 767 825 768 826 loops = 1000; ··· 846 904 pbuf.req.minor = 0; 847 905 strcpy(pbuf.req.svc_id, cp->service_id); 848 906 849 - err = ds_send(lp, &pbuf, msg_len); 907 + err = __ds_send(lp, &pbuf, msg_len); 850 908 if (err > 0) 851 909 cp->state = CAP_STATE_REG_SENT; 852 910 } ··· 902 960 return -ECONNRESET; 903 961 } 904 962 963 + static void __send_ds_nack(struct ds_info *dp, u64 handle) 964 + { 965 + struct ds_data_nack nack = { 966 + .tag = { 967 + .type = DS_NACK, 968 + .len = (sizeof(struct ds_data_nack) - 969 + sizeof(struct ds_msg_tag)), 970 + }, 971 + .handle = handle, 972 + .result = DS_INV_HDL, 973 + }; 974 + 975 + __ds_send(dp->lp, &nack, sizeof(nack)); 976 + } 977 + 978 + static LIST_HEAD(ds_work_list); 979 + static DECLARE_WAIT_QUEUE_HEAD(ds_wait); 980 + 981 + struct ds_queue_entry { 982 + struct list_head list; 983 + int req_len; 984 + int __pad; 985 + u64 req[0]; 986 + }; 987 + 988 + static void process_ds_work(void) 989 + { 990 + struct ds_queue_entry *qp, *tmp; 991 + static struct ds_info *dp; 992 + unsigned long flags; 993 + LIST_HEAD(todo); 994 + 995 + spin_lock_irqsave(&ds_lock, flags); 996 + list_splice(&ds_work_list, &todo); 997 + INIT_LIST_HEAD(&ds_work_list); 998 + spin_unlock_irqrestore(&ds_lock, flags); 999 + 1000 + dp = ds_info; 1001 + 1002 + list_for_each_entry_safe(qp, tmp, &todo, list) { 1003 + struct ds_data *dpkt = (struct ds_data *) qp->req; 1004 + struct ds_cap_state *cp = find_cap(dpkt->handle); 1005 + int req_len = qp->req_len; 1006 + 1007 + if (!cp) { 1008 + printk(KERN_ERR PFX "Data for unknown handle %lu\n", 1009 + dpkt->handle); 1010 + 1011 + spin_lock_irqsave(&ds_lock, flags); 1012 + __send_ds_nack(dp, dpkt->handle); 1013 + spin_unlock_irqrestore(&ds_lock, flags); 1014 + } else { 1015 + cp->data(dp->lp, cp, dpkt, req_len); 1016 + } 1017 + 1018 + list_del(&qp->list); 1019 + kfree(qp); 1020 + } 1021 + } 1022 + 1023 + static int ds_thread(void *__unused) 1024 + { 1025 + DEFINE_WAIT(wait); 1026 + 1027 + while (1) { 1028 + prepare_to_wait(&ds_wait, &wait, TASK_INTERRUPTIBLE); 1029 + if (list_empty(&ds_work_list)) 1030 + schedule(); 1031 + finish_wait(&ds_wait, &wait); 1032 + 1033 + if (kthread_should_stop()) 1034 + break; 1035 + 1036 + process_ds_work(); 1037 + } 1038 + 1039 + return 0; 1040 + } 1041 + 905 1042 static int ds_data(struct ds_info *dp, struct ds_msg_tag *pkt, int len) 906 1043 { 907 1044 struct ds_data *dpkt = (struct ds_data *) pkt; 908 - struct ds_cap_state *cp = find_cap(dpkt->handle); 1045 + struct ds_queue_entry *qp; 909 1046 910 - if (!cp) { 911 - struct ds_data_nack nack = { 912 - .tag = { 913 - .type = DS_NACK, 914 - .len = (sizeof(struct ds_data_nack) - 915 - sizeof(struct ds_msg_tag)), 916 - }, 917 - .handle = dpkt->handle, 918 - .result = DS_INV_HDL, 919 - }; 920 - 921 - printk(KERN_ERR PFX "Data for unknown handle %lu\n", 922 - dpkt->handle); 923 - ds_send(dp->lp, &nack, sizeof(nack)); 1047 + qp = kmalloc(sizeof(struct ds_queue_entry) + len, GFP_ATOMIC); 1048 + if (!qp) { 1049 + __send_ds_nack(dp, dpkt->handle); 924 1050 } else { 925 - cp->data(dp->lp, cp, dpkt, len); 1051 + memcpy(&qp->req, pkt, len); 1052 + list_add_tail(&qp->list, &ds_work_list); 1053 + wake_up(&ds_wait); 926 1054 } 927 1055 return 0; 928 1056 } ··· 1008 996 req.ver.major = 1; 1009 997 req.ver.minor = 0; 1010 998 1011 - err = ds_send(lp, &req, sizeof(req)); 999 + err = __ds_send(lp, &req, sizeof(req)); 1012 1000 if (err > 0) 1013 1001 dp->hs_state = DS_HS_START; 1014 1002 } ··· 1160 1148 for (i = 0; i < ARRAY_SIZE(ds_states); i++) 1161 1149 ds_states[i].handle = ((u64)i << 32); 1162 1150 1163 - #ifdef CONFIG_HOTPLUG_CPU 1164 - kthread_run(dr_cpu_thread, NULL, "kdrcpud"); 1165 - #endif 1151 + kthread_run(ds_thread, NULL, "kldomd"); 1166 1152 1167 1153 return vio_register_driver(&ds_driver); 1168 1154 }
+7 -13
arch/sparc64/kernel/mdesc.c
··· 214 214 } 215 215 EXPORT_SYMBOL(mdesc_release); 216 216 217 - static void do_mdesc_update(struct work_struct *work) 217 + void mdesc_update(void) 218 218 { 219 219 unsigned long len, real_len, status; 220 220 struct mdesc_handle *hp, *orig_hp; ··· 248 248 spin_unlock_irqrestore(&mdesc_lock, flags); 249 249 } 250 250 251 - static DECLARE_WORK(mdesc_update_work, do_mdesc_update); 252 - 253 - void mdesc_update(void) 254 - { 255 - schedule_work(&mdesc_update_work); 256 - } 257 - 258 251 static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc) 259 252 { 260 253 return (struct mdesc_elem *) (mdesc + 1); ··· 271 278 u64 last_node = hp->mdesc.node_sz / 16; 272 279 u64 ret; 273 280 274 - if (from_node == MDESC_NODE_NULL) 275 - from_node = 0; 276 - 277 - if (from_node >= last_node) 281 + if (from_node == MDESC_NODE_NULL) { 282 + ret = from_node = 0; 283 + } else if (from_node >= last_node) { 278 284 return MDESC_NODE_NULL; 285 + } else { 286 + ret = ep[from_node].d.val; 287 + } 279 288 280 - ret = ep[from_node].d.val; 281 289 while (ret < last_node) { 282 290 if (ep[ret].tag != MD_NODE) 283 291 return MDESC_NODE_NULL;
+2 -2
arch/sparc64/kernel/setup.c
··· 454 454 ncpus_probed, 455 455 num_online_cpus(), 456 456 dcache_parity_tl1_occurred, 457 - icache_parity_tl1_occurred, 457 + icache_parity_tl1_occurred 458 458 #ifndef CONFIG_SMP 459 - cpu_data(0).clock_tick 459 + , cpu_data(0).clock_tick 460 460 #endif 461 461 ); 462 462 #ifdef CONFIG_SMP
+1 -11
drivers/serial/sunhv.c
··· 258 258 /* port->lock held by caller. */ 259 259 static void sunhv_start_tx(struct uart_port *port) 260 260 { 261 - struct circ_buf *xmit = &port->info->xmit; 262 - 263 - while (!uart_circ_empty(xmit)) { 264 - long status = sun4v_con_putchar(xmit->buf[xmit->tail]); 265 - 266 - if (status != HV_EOK) 267 - break; 268 - 269 - xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); 270 - port->icount.tx++; 271 - } 261 + transmit_chars(port); 272 262 } 273 263 274 264 /* port->lock is not held. */