Merge of /home/davem/src/GIT/linux-2.6/.git/

+103 -80
+1 -1
Makefile
··· 1 1 VERSION = 2 2 2 PATCHLEVEL = 6 3 3 SUBLEVEL = 12 4 - EXTRAVERSION =-rc4 4 + EXTRAVERSION =-rc5 5 5 NAME=Woozy Numbat 6 6 7 7 # *DOCUMENTATION*
+8 -9
arch/i386/mach-voyager/voyager_smp.c
··· 97 97 static void vic_enable_cpi(void); 98 98 static void do_boot_cpu(__u8 cpuid); 99 99 static void do_quad_bootstrap(void); 100 - static inline void wrapper_smp_local_timer_interrupt(struct pt_regs *); 101 100 102 101 int hard_smp_processor_id(void); 103 102 ··· 122 123 send_one_QIC_CPI(cpu, cpi - QIC_CPI_OFFSET); 123 124 } 124 125 } 126 + } 127 + 128 + static inline void 129 + wrapper_smp_local_timer_interrupt(struct pt_regs *regs) 130 + { 131 + irq_enter(); 132 + smp_local_timer_interrupt(regs); 133 + irq_exit(); 125 134 } 126 135 127 136 static inline void ··· 1254 1247 { 1255 1248 send_CPI_allbutself(VIC_TIMER_CPI); 1256 1249 smp_local_timer_interrupt(regs); 1257 - } 1258 - 1259 - static inline void 1260 - wrapper_smp_local_timer_interrupt(struct pt_regs *regs) 1261 - { 1262 - irq_enter(); 1263 - smp_local_timer_interrupt(regs); 1264 - irq_exit(); 1265 1250 } 1266 1251 1267 1252 /* local (per CPU) timer interrupt. It does both profiling and
+65 -20
arch/ppc64/kernel/mf.c
··· 1 1 /* 2 2 * mf.c 3 3 * Copyright (C) 2001 Troy D. Armstrong IBM Corporation 4 - * Copyright (C) 2004 Stephen Rothwell IBM Corporation 4 + * Copyright (C) 2004-2005 Stephen Rothwell IBM Corporation 5 5 * 6 6 * This modules exists as an interface between a Linux secondary partition 7 7 * running on an iSeries and the primary partition's Virtual Service ··· 36 36 37 37 #include <asm/time.h> 38 38 #include <asm/uaccess.h> 39 + #include <asm/paca.h> 39 40 #include <asm/iSeries/vio.h> 40 41 #include <asm/iSeries/mf.h> 41 42 #include <asm/iSeries/HvLpConfig.h> 42 43 #include <asm/iSeries/ItSpCommArea.h> 44 + #include <asm/iSeries/ItLpQueue.h> 43 45 44 46 /* 45 47 * This is the structure layout for the Machine Facilites LPAR event ··· 698 696 complete(&rtc->com); 699 697 } 700 698 701 - int mf_get_rtc(struct rtc_time *tm) 699 + static int rtc_set_tm(int rc, u8 *ce_msg, struct rtc_time *tm) 702 700 { 703 - struct ce_msg_comp_data ce_complete; 704 - struct rtc_time_data rtc_data; 705 - int rc; 706 - 707 - memset(&ce_complete, 0, sizeof(ce_complete)); 708 - memset(&rtc_data, 0, sizeof(rtc_data)); 709 - init_completion(&rtc_data.com); 710 - ce_complete.handler = &get_rtc_time_complete; 711 - ce_complete.token = &rtc_data; 712 - rc = signal_ce_msg_simple(0x40, &ce_complete); 713 - if (rc) 714 - return rc; 715 - wait_for_completion(&rtc_data.com); 716 701 tm->tm_wday = 0; 717 702 tm->tm_yday = 0; 718 703 tm->tm_isdst = 0; 719 - if (rtc_data.rc) { 704 + if (rc) { 720 705 tm->tm_sec = 0; 721 706 tm->tm_min = 0; 722 707 tm->tm_hour = 0; 723 708 tm->tm_mday = 15; 724 709 tm->tm_mon = 5; 725 710 tm->tm_year = 52; 726 - return rtc_data.rc; 711 + return rc; 727 712 } 728 713 729 - if ((rtc_data.ce_msg.ce_msg[2] == 0xa9) || 730 - (rtc_data.ce_msg.ce_msg[2] == 0xaf)) { 714 + if ((ce_msg[2] == 0xa9) || 715 + (ce_msg[2] == 0xaf)) { 731 716 /* TOD clock is not set */ 732 717 tm->tm_sec = 1; 733 718 tm->tm_min = 1; ··· 725 736 mf_set_rtc(tm); 726 737 } 727 738 { 728 - u8 *ce_msg = rtc_data.ce_msg.ce_msg; 729 739 u8 year = ce_msg[5]; 730 740 u8 sec = ce_msg[6]; 731 741 u8 min = ce_msg[7]; ··· 751 763 } 752 764 753 765 return 0; 766 + } 767 + 768 + int mf_get_rtc(struct rtc_time *tm) 769 + { 770 + struct ce_msg_comp_data ce_complete; 771 + struct rtc_time_data rtc_data; 772 + int rc; 773 + 774 + memset(&ce_complete, 0, sizeof(ce_complete)); 775 + memset(&rtc_data, 0, sizeof(rtc_data)); 776 + init_completion(&rtc_data.com); 777 + ce_complete.handler = &get_rtc_time_complete; 778 + ce_complete.token = &rtc_data; 779 + rc = signal_ce_msg_simple(0x40, &ce_complete); 780 + if (rc) 781 + return rc; 782 + wait_for_completion(&rtc_data.com); 783 + return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm); 784 + } 785 + 786 + struct boot_rtc_time_data { 787 + int busy; 788 + struct ce_msg_data ce_msg; 789 + int rc; 790 + }; 791 + 792 + static void get_boot_rtc_time_complete(void *token, struct ce_msg_data *ce_msg) 793 + { 794 + struct boot_rtc_time_data *rtc = token; 795 + 796 + memcpy(&rtc->ce_msg, ce_msg, sizeof(rtc->ce_msg)); 797 + rtc->rc = 0; 798 + rtc->busy = 0; 799 + } 800 + 801 + int mf_get_boot_rtc(struct rtc_time *tm) 802 + { 803 + struct ce_msg_comp_data ce_complete; 804 + struct boot_rtc_time_data rtc_data; 805 + int rc; 806 + 807 + memset(&ce_complete, 0, sizeof(ce_complete)); 808 + memset(&rtc_data, 0, sizeof(rtc_data)); 809 + rtc_data.busy = 1; 810 + ce_complete.handler = &get_boot_rtc_time_complete; 811 + ce_complete.token = &rtc_data; 812 + rc = signal_ce_msg_simple(0x40, &ce_complete); 813 + if (rc) 814 + return rc; 815 + /* We need to poll here as we are not yet taking interrupts */ 816 + while (rtc_data.busy) { 817 + extern unsigned long lpevent_count; 818 + struct ItLpQueue *lpq = get_paca()->lpqueue_ptr; 819 + if (lpq && ItLpQueue_isLpIntPending(lpq)) 820 + lpevent_count += ItLpQueue_process(lpq, NULL); 821 + } 822 + return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm); 754 823 } 755 824 756 825 int mf_set_rtc(struct rtc_time *tm)
+1 -38
arch/ppc64/kernel/rtc.c
··· 292 292 293 293 void iSeries_get_boot_time(struct rtc_time *tm) 294 294 { 295 - unsigned long time; 296 - static unsigned long lastsec = 1; 297 - 298 - u32 dataWord1 = *((u32 *)(&xSpCommArea.xBcdTimeAtIplStart)); 299 - u32 dataWord2 = *(((u32 *)&(xSpCommArea.xBcdTimeAtIplStart)) + 1); 300 - int year = 1970; 301 - int year1 = ( dataWord1 >> 24 ) & 0x000000FF; 302 - int year2 = ( dataWord1 >> 16 ) & 0x000000FF; 303 - int sec = ( dataWord1 >> 8 ) & 0x000000FF; 304 - int min = dataWord1 & 0x000000FF; 305 - int hour = ( dataWord2 >> 24 ) & 0x000000FF; 306 - int day = ( dataWord2 >> 8 ) & 0x000000FF; 307 - int mon = dataWord2 & 0x000000FF; 308 - 309 295 if ( piranha_simulator ) 310 296 return; 311 297 312 - BCD_TO_BIN(sec); 313 - BCD_TO_BIN(min); 314 - BCD_TO_BIN(hour); 315 - BCD_TO_BIN(day); 316 - BCD_TO_BIN(mon); 317 - BCD_TO_BIN(year1); 318 - BCD_TO_BIN(year2); 319 - year = year1 * 100 + year2; 320 - 321 - time = mktime(year, mon, day, hour, min, sec); 322 - time += ( jiffies / HZ ); 323 - 324 - /* Now THIS is a nasty hack! 325 - * It ensures that the first two calls get different answers. 326 - * That way the loop in init_time (time.c) will not think 327 - * the clock is stuck. 328 - */ 329 - if ( lastsec ) { 330 - time -= lastsec; 331 - --lastsec; 332 - } 333 - 334 - to_tm(time, tm); 335 - tm->tm_year -= 1900; 298 + mf_get_boot_rtc(tm); 336 299 tm->tm_mon -= 1; 337 300 } 338 301 #endif
+1
arch/ppc64/kernel/time.c
··· 515 515 do_gtod.varp = &do_gtod.vars[0]; 516 516 do_gtod.var_idx = 0; 517 517 do_gtod.varp->tb_orig_stamp = tb_last_stamp; 518 + get_paca()->next_jiffy_update_tb = tb_last_stamp + tb_ticks_per_jiffy; 518 519 do_gtod.varp->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC; 519 520 do_gtod.tb_ticks_per_sec = tb_ticks_per_sec; 520 521 do_gtod.varp->tb_to_xs = tb_to_xs;
+1 -1
drivers/ide/ide-cd.c
··· 1933 1933 /* 1934 1934 * check if dma is safe 1935 1935 */ 1936 - if ((rq->data_len & mask) || (addr & mask)) 1936 + if ((rq->data_len & 3) || (addr & mask)) 1937 1937 info->dma = 0; 1938 1938 } 1939 1939
+5 -5
drivers/media/video/saa7134/saa6752hs.c
··· 43 43 static const struct v4l2_format v4l2_format_table[] = 44 44 { 45 45 [SAA6752HS_VF_D1] = { 46 - .fmt.pix.width = 720, .fmt.pix.height = 576 }, 46 + .fmt = { .pix = { .width = 720, .height = 576 }, }, }, 47 47 [SAA6752HS_VF_2_3_D1] = { 48 - .fmt.pix.width = 480, .fmt.pix.height = 576 }, 48 + .fmt = { .pix = { .width = 480, .height = 576 }, }, }, 49 49 [SAA6752HS_VF_1_2_D1] = { 50 - .fmt.pix.width = 352, .fmt.pix.height = 576 }, 50 + .fmt = { .pix = { .width = 352, .height = 576 }, }, }, 51 51 [SAA6752HS_VF_SIF] = { 52 - .fmt.pix.width = 352, .fmt.pix.height = 288 }, 52 + .fmt = { .pix = { .width = 352, .height = 288 }, }, }, 53 53 [SAA6752HS_VF_UNKNOWN] = { 54 - .fmt.pix.width = 0, .fmt.pix.height = 0}, 54 + .fmt = { .pix = { .width = 0, .height = 0 }, }, }, 55 55 }; 56 56 57 57 struct saa6752hs_state {
+5 -2
drivers/scsi/aic7xxx/aic7xxx_osm.c
··· 659 659 ahc_lock(ahc, &flags); 660 660 targ = ahc->platform_data->targets[target_offset]; 661 661 if (targ == NULL) { 662 - targ = ahc_linux_alloc_target(ahc, starget->channel, starget->id); 663 - struct seeprom_config *sc = ahc->seep_config; 662 + struct seeprom_config *sc; 663 + 664 + targ = ahc_linux_alloc_target(ahc, starget->channel, 665 + starget->id); 666 + sc = ahc->seep_config; 664 667 if (targ == NULL) 665 668 goto out; 666 669
+2
drivers/usb/atm/speedtch.c
··· 386 386 if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) { 387 387 instance->u.atm_dev->signal = ATM_PHY_SIG_LOST; 388 388 printk(KERN_NOTICE "ADSL line is down\n"); 389 + /* It'll never resync again unless we ask it to... */ 390 + speedtch_start_synchro(instance); 389 391 } 390 392 break; 391 393
+1
include/asm-ppc64/iSeries/mf.h
··· 52 52 extern void mf_init(void); 53 53 54 54 extern int mf_get_rtc(struct rtc_time *tm); 55 + extern int mf_get_boot_rtc(struct rtc_time *tm); 55 56 extern int mf_set_rtc(struct rtc_time *tm); 56 57 57 58 #endif /* _ASM_PPC64_ISERIES_MF_H */
+10 -1
kernel/signal.c
··· 522 522 { 523 523 int sig = 0; 524 524 525 - sig = next_signal(pending, mask); 525 + /* SIGKILL must have priority, otherwise it is quite easy 526 + * to create an unkillable process, sending sig < SIGKILL 527 + * to self */ 528 + if (unlikely(sigismember(&pending->signal, SIGKILL))) { 529 + if (!sigismember(mask, SIGKILL)) 530 + sig = SIGKILL; 531 + } 532 + 533 + if (likely(!sig)) 534 + sig = next_signal(pending, mask); 526 535 if (sig) { 527 536 if (current->notifier) { 528 537 if (sigismember(current->notifier_mask, sig)) {
+3 -3
mm/rmap.c
··· 626 626 pgd_t *pgd; 627 627 pud_t *pud; 628 628 pmd_t *pmd; 629 - pte_t *pte; 629 + pte_t *pte, *original_pte; 630 630 pte_t pteval; 631 631 struct page *page; 632 632 unsigned long address; ··· 658 658 if (!pmd_present(*pmd)) 659 659 goto out_unlock; 660 660 661 - for (pte = pte_offset_map(pmd, address); 661 + for (original_pte = pte = pte_offset_map(pmd, address); 662 662 address < end; pte++, address += PAGE_SIZE) { 663 663 664 664 if (!pte_present(*pte)) ··· 694 694 (*mapcount)--; 695 695 } 696 696 697 - pte_unmap(pte); 697 + pte_unmap(original_pte); 698 698 out_unlock: 699 699 spin_unlock(&mm->page_table_lock); 700 700 }