diff options
61 files changed, 879 insertions, 280 deletions
diff --git a/arch/avr32/boards/atstk1000/atstk1000.h b/arch/avr32/boards/atstk1000/atstk1000.h new file mode 100644 index 000000000000..9a49ed036b72 --- /dev/null +++ b/arch/avr32/boards/atstk1000/atstk1000.h | |||
@@ -0,0 +1,15 @@ | |||
1 | /* | ||
2 | * ATSTK1000 setup code: Daughterboard interface | ||
3 | * | ||
4 | * Copyright (C) 2007 Atmel Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #ifndef __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H | ||
11 | #define __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H | ||
12 | |||
13 | extern struct atmel_lcdfb_info atstk1000_lcdc_data; | ||
14 | |||
15 | #endif /* __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H */ | ||
diff --git a/arch/avr32/boards/atstk1000/atstk1002.c b/arch/avr32/boards/atstk1000/atstk1002.c index abe6ca203fa7..fe1dbe2e28f4 100644 --- a/arch/avr32/boards/atstk1000/atstk1002.c +++ b/arch/avr32/boards/atstk1000/atstk1002.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/spi/spi.h> | 17 | #include <linux/spi/spi.h> |
18 | 18 | ||
19 | #include <video/atmel_lcdc.h> | ||
20 | |||
19 | #include <asm/io.h> | 21 | #include <asm/io.h> |
20 | #include <asm/setup.h> | 22 | #include <asm/setup.h> |
21 | #include <asm/arch/at32ap7000.h> | 23 | #include <asm/arch/at32ap7000.h> |
@@ -23,6 +25,7 @@ | |||
23 | #include <asm/arch/init.h> | 25 | #include <asm/arch/init.h> |
24 | #include <asm/arch/portmux.h> | 26 | #include <asm/arch/portmux.h> |
25 | 27 | ||
28 | #include "atstk1000.h" | ||
26 | 29 | ||
27 | #define SW2_DEFAULT /* MMCI and UART_A available */ | 30 | #define SW2_DEFAULT /* MMCI and UART_A available */ |
28 | 31 | ||
@@ -31,9 +34,7 @@ struct eth_addr { | |||
31 | }; | 34 | }; |
32 | 35 | ||
33 | static struct eth_addr __initdata hw_addr[2]; | 36 | static struct eth_addr __initdata hw_addr[2]; |
34 | |||
35 | static struct eth_platform_data __initdata eth_data[2]; | 37 | static struct eth_platform_data __initdata eth_data[2]; |
36 | static struct lcdc_platform_data atstk1000_fb0_data; | ||
37 | 38 | ||
38 | static struct spi_board_info spi0_board_info[] __initdata = { | 39 | static struct spi_board_info spi0_board_info[] __initdata = { |
39 | { | 40 | { |
@@ -148,9 +149,8 @@ static int __init atstk1002_init(void) | |||
148 | set_hw_addr(at32_add_device_eth(0, ð_data[0])); | 149 | set_hw_addr(at32_add_device_eth(0, ð_data[0])); |
149 | 150 | ||
150 | at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); | 151 | at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); |
151 | atstk1000_fb0_data.fbmem_start = fbmem_start; | 152 | at32_add_device_lcdc(0, &atstk1000_lcdc_data, |
152 | atstk1000_fb0_data.fbmem_size = fbmem_size; | 153 | fbmem_start, fbmem_size); |
153 | at32_add_device_lcdc(0, &atstk1000_fb0_data); | ||
154 | 154 | ||
155 | return 0; | 155 | return 0; |
156 | } | 156 | } |
diff --git a/arch/avr32/boards/atstk1000/setup.c b/arch/avr32/boards/atstk1000/setup.c index 2bc4b88d7edb..c9af409ada9a 100644 --- a/arch/avr32/boards/atstk1000/setup.c +++ b/arch/avr32/boards/atstk1000/setup.c | |||
@@ -8,13 +8,56 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/bootmem.h> | 10 | #include <linux/bootmem.h> |
11 | #include <linux/fb.h> | ||
11 | #include <linux/init.h> | 12 | #include <linux/init.h> |
12 | #include <linux/types.h> | 13 | #include <linux/types.h> |
13 | #include <linux/linkage.h> | 14 | #include <linux/linkage.h> |
14 | 15 | ||
15 | #include <asm/setup.h> | 16 | #include <video/atmel_lcdc.h> |
16 | 17 | ||
18 | #include <asm/setup.h> | ||
17 | #include <asm/arch/board.h> | 19 | #include <asm/arch/board.h> |
18 | 20 | ||
21 | #include "atstk1000.h" | ||
22 | |||
19 | /* Initialized by bootloader-specific startup code. */ | 23 | /* Initialized by bootloader-specific startup code. */ |
20 | struct tag *bootloader_tags __initdata; | 24 | struct tag *bootloader_tags __initdata; |
25 | |||
26 | static struct fb_videomode __initdata ltv350qv_modes[] = { | ||
27 | { | ||
28 | .name = "320x240 @ 75", | ||
29 | .refresh = 75, | ||
30 | .xres = 320, .yres = 240, | ||
31 | .pixclock = KHZ2PICOS(6891), | ||
32 | |||
33 | .left_margin = 17, .right_margin = 33, | ||
34 | .upper_margin = 10, .lower_margin = 10, | ||
35 | .hsync_len = 16, .vsync_len = 1, | ||
36 | |||
37 | .sync = 0, | ||
38 | .vmode = FB_VMODE_NONINTERLACED, | ||
39 | }, | ||
40 | }; | ||
41 | |||
42 | static struct fb_monspecs __initdata atstk1000_default_monspecs = { | ||
43 | .manufacturer = "SNG", | ||
44 | .monitor = "LTV350QV", | ||
45 | .modedb = ltv350qv_modes, | ||
46 | .modedb_len = ARRAY_SIZE(ltv350qv_modes), | ||
47 | .hfmin = 14820, | ||
48 | .hfmax = 22230, | ||
49 | .vfmin = 60, | ||
50 | .vfmax = 90, | ||
51 | .dclkmax = 30000000, | ||
52 | }; | ||
53 | |||
54 | struct atmel_lcdfb_info __initdata atstk1000_lcdc_data = { | ||
55 | .default_bpp = 24, | ||
56 | .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN, | ||
57 | .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT | ||
58 | | ATMEL_LCDC_INVCLK | ||
59 | | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE | ||
60 | | ATMEL_LCDC_MEMOR_BIG), | ||
61 | .default_monspecs = &atstk1000_default_monspecs, | ||
62 | .guard_time = 2, | ||
63 | }; | ||
diff --git a/arch/avr32/kernel/irq.c b/arch/avr32/kernel/irq.c index fd311248c143..61f2de266f62 100644 --- a/arch/avr32/kernel/irq.c +++ b/arch/avr32/kernel/irq.c | |||
@@ -7,15 +7,6 @@ | |||
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | * | ||
11 | * This file contains the code used by various IRQ handling routines: | ||
12 | * asking for different IRQ's should be done through these routines | ||
13 | * instead of just grabbing them. Thus setups with different IRQ numbers | ||
14 | * shouldn't result in any weird surprises, and installing new handlers | ||
15 | * should be easier. | ||
16 | * | ||
17 | * IRQ's are in fact implemented a bit like signal handlers for the kernel. | ||
18 | * Naturally it's not a 1:1 relation, but there are similarities. | ||
19 | */ | 10 | */ |
20 | 11 | ||
21 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
diff --git a/arch/avr32/kernel/kprobes.c b/arch/avr32/kernel/kprobes.c index 004c94b6fc1d..4942ee662e0b 100644 --- a/arch/avr32/kernel/kprobes.c +++ b/arch/avr32/kernel/kprobes.c | |||
@@ -179,7 +179,7 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs) | |||
179 | return 1; | 179 | return 1; |
180 | } | 180 | } |
181 | 181 | ||
182 | static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | 182 | int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) |
183 | { | 183 | { |
184 | struct kprobe *cur = kprobe_running(); | 184 | struct kprobe *cur = kprobe_running(); |
185 | 185 | ||
@@ -216,11 +216,6 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
216 | if (post_kprobe_handler(args->regs)) | 216 | if (post_kprobe_handler(args->regs)) |
217 | ret = NOTIFY_STOP; | 217 | ret = NOTIFY_STOP; |
218 | break; | 218 | break; |
219 | case DIE_FAULT: | ||
220 | if (kprobe_running() | ||
221 | && kprobe_fault_handler(args->regs, args->trapnr)) | ||
222 | ret = NOTIFY_STOP; | ||
223 | break; | ||
224 | default: | 219 | default: |
225 | break; | 220 | break; |
226 | } | 221 | } |
diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index 07f6a6fa340d..75c81f2dd0b3 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S | |||
@@ -292,4 +292,7 @@ sys_call_table: | |||
292 | .long sys_shmdt | 292 | .long sys_shmdt |
293 | .long sys_shmctl | 293 | .long sys_shmctl |
294 | .long sys_utimensat | 294 | .long sys_utimensat |
295 | .long sys_signalfd | ||
296 | .long sys_timerfd /* 280 */ | ||
297 | .long sys_eventfd | ||
295 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ | 298 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ |
diff --git a/arch/avr32/mach-at32ap/at32ap7000.c b/arch/avr32/mach-at32ap/at32ap7000.c index 56db45b99a0f..1d2bf347a1d6 100644 --- a/arch/avr32/mach-at32ap/at32ap7000.c +++ b/arch/avr32/mach-at32ap/at32ap7000.c | |||
@@ -6,6 +6,7 @@ | |||
6 | * published by the Free Software Foundation. | 6 | * published by the Free Software Foundation. |
7 | */ | 7 | */ |
8 | #include <linux/clk.h> | 8 | #include <linux/clk.h> |
9 | #include <linux/fb.h> | ||
9 | #include <linux/init.h> | 10 | #include <linux/init.h> |
10 | #include <linux/platform_device.h> | 11 | #include <linux/platform_device.h> |
11 | #include <linux/spi/spi.h> | 12 | #include <linux/spi/spi.h> |
@@ -17,6 +18,8 @@ | |||
17 | #include <asm/arch/portmux.h> | 18 | #include <asm/arch/portmux.h> |
18 | #include <asm/arch/sm.h> | 19 | #include <asm/arch/sm.h> |
19 | 20 | ||
21 | #include <video/atmel_lcdc.h> | ||
22 | |||
20 | #include "clock.h" | 23 | #include "clock.h" |
21 | #include "hmatrix.h" | 24 | #include "hmatrix.h" |
22 | #include "pio.h" | 25 | #include "pio.h" |
@@ -881,20 +884,26 @@ at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n) | |||
881 | /* -------------------------------------------------------------------- | 884 | /* -------------------------------------------------------------------- |
882 | * LCDC | 885 | * LCDC |
883 | * -------------------------------------------------------------------- */ | 886 | * -------------------------------------------------------------------- */ |
884 | static struct lcdc_platform_data lcdc0_data; | 887 | static struct atmel_lcdfb_info atmel_lcdfb0_data; |
885 | static struct resource lcdc0_resource[] = { | 888 | static struct resource atmel_lcdfb0_resource[] = { |
886 | { | 889 | { |
887 | .start = 0xff000000, | 890 | .start = 0xff000000, |
888 | .end = 0xff000fff, | 891 | .end = 0xff000fff, |
889 | .flags = IORESOURCE_MEM, | 892 | .flags = IORESOURCE_MEM, |
890 | }, | 893 | }, |
891 | IRQ(1), | 894 | IRQ(1), |
895 | { | ||
896 | /* Placeholder for pre-allocated fb memory */ | ||
897 | .start = 0x00000000, | ||
898 | .end = 0x00000000, | ||
899 | .flags = 0, | ||
900 | }, | ||
892 | }; | 901 | }; |
893 | DEFINE_DEV_DATA(lcdc, 0); | 902 | DEFINE_DEV_DATA(atmel_lcdfb, 0); |
894 | DEV_CLK(hclk, lcdc0, hsb, 7); | 903 | DEV_CLK(hck1, atmel_lcdfb0, hsb, 7); |
895 | static struct clk lcdc0_pixclk = { | 904 | static struct clk atmel_lcdfb0_pixclk = { |
896 | .name = "pixclk", | 905 | .name = "lcdc_clk", |
897 | .dev = &lcdc0_device.dev, | 906 | .dev = &atmel_lcdfb0_device.dev, |
898 | .mode = genclk_mode, | 907 | .mode = genclk_mode, |
899 | .get_rate = genclk_get_rate, | 908 | .get_rate = genclk_get_rate, |
900 | .set_rate = genclk_set_rate, | 909 | .set_rate = genclk_set_rate, |
@@ -903,13 +912,34 @@ static struct clk lcdc0_pixclk = { | |||
903 | }; | 912 | }; |
904 | 913 | ||
905 | struct platform_device *__init | 914 | struct platform_device *__init |
906 | at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data) | 915 | at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data, |
916 | unsigned long fbmem_start, unsigned long fbmem_len) | ||
907 | { | 917 | { |
908 | struct platform_device *pdev; | 918 | struct platform_device *pdev; |
919 | struct atmel_lcdfb_info *info; | ||
920 | struct fb_monspecs *monspecs; | ||
921 | struct fb_videomode *modedb; | ||
922 | unsigned int modedb_size; | ||
923 | |||
924 | /* | ||
925 | * Do a deep copy of the fb data, monspecs and modedb. Make | ||
926 | * sure all allocations are done before setting up the | ||
927 | * portmux. | ||
928 | */ | ||
929 | monspecs = kmemdup(data->default_monspecs, | ||
930 | sizeof(struct fb_monspecs), GFP_KERNEL); | ||
931 | if (!monspecs) | ||
932 | return NULL; | ||
933 | |||
934 | modedb_size = sizeof(struct fb_videomode) * monspecs->modedb_len; | ||
935 | modedb = kmemdup(monspecs->modedb, modedb_size, GFP_KERNEL); | ||
936 | if (!modedb) | ||
937 | goto err_dup_modedb; | ||
938 | monspecs->modedb = modedb; | ||
909 | 939 | ||
910 | switch (id) { | 940 | switch (id) { |
911 | case 0: | 941 | case 0: |
912 | pdev = &lcdc0_device; | 942 | pdev = &atmel_lcdfb0_device; |
913 | select_peripheral(PC(19), PERIPH_A, 0); /* CC */ | 943 | select_peripheral(PC(19), PERIPH_A, 0); /* CC */ |
914 | select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ | 944 | select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ |
915 | select_peripheral(PC(21), PERIPH_A, 0); /* PCLK */ | 945 | select_peripheral(PC(21), PERIPH_A, 0); /* PCLK */ |
@@ -942,19 +972,32 @@ at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data) | |||
942 | select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */ | 972 | select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */ |
943 | select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */ | 973 | select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */ |
944 | 974 | ||
945 | clk_set_parent(&lcdc0_pixclk, &pll0); | 975 | clk_set_parent(&atmel_lcdfb0_pixclk, &pll0); |
946 | clk_set_rate(&lcdc0_pixclk, clk_get_rate(&pll0)); | 976 | clk_set_rate(&atmel_lcdfb0_pixclk, clk_get_rate(&pll0)); |
947 | break; | 977 | break; |
948 | 978 | ||
949 | default: | 979 | default: |
950 | return NULL; | 980 | goto err_invalid_id; |
951 | } | 981 | } |
952 | 982 | ||
953 | memcpy(pdev->dev.platform_data, data, | 983 | if (fbmem_len) { |
954 | sizeof(struct lcdc_platform_data)); | 984 | pdev->resource[2].start = fbmem_start; |
985 | pdev->resource[2].end = fbmem_start + fbmem_len - 1; | ||
986 | pdev->resource[2].flags = IORESOURCE_MEM; | ||
987 | } | ||
988 | |||
989 | info = pdev->dev.platform_data; | ||
990 | memcpy(info, data, sizeof(struct atmel_lcdfb_info)); | ||
991 | info->default_monspecs = monspecs; | ||
955 | 992 | ||
956 | platform_device_register(pdev); | 993 | platform_device_register(pdev); |
957 | return pdev; | 994 | return pdev; |
995 | |||
996 | err_invalid_id: | ||
997 | kfree(modedb); | ||
998 | err_dup_modedb: | ||
999 | kfree(monspecs); | ||
1000 | return NULL; | ||
958 | } | 1001 | } |
959 | 1002 | ||
960 | /* -------------------------------------------------------------------- | 1003 | /* -------------------------------------------------------------------- |
@@ -1037,8 +1080,8 @@ struct clk *at32_clock_list[] = { | |||
1037 | &macb1_pclk, | 1080 | &macb1_pclk, |
1038 | &atmel_spi0_spi_clk, | 1081 | &atmel_spi0_spi_clk, |
1039 | &atmel_spi1_spi_clk, | 1082 | &atmel_spi1_spi_clk, |
1040 | &lcdc0_hclk, | 1083 | &atmel_lcdfb0_hck1, |
1041 | &lcdc0_pixclk, | 1084 | &atmel_lcdfb0_pixclk, |
1042 | &gclk0, | 1085 | &gclk0, |
1043 | &gclk1, | 1086 | &gclk1, |
1044 | &gclk2, | 1087 | &gclk2, |
@@ -1077,7 +1120,7 @@ void __init at32_clock_init(void) | |||
1077 | genclk_init_parent(&gclk2); | 1120 | genclk_init_parent(&gclk2); |
1078 | genclk_init_parent(&gclk3); | 1121 | genclk_init_parent(&gclk3); |
1079 | genclk_init_parent(&gclk4); | 1122 | genclk_init_parent(&gclk4); |
1080 | genclk_init_parent(&lcdc0_pixclk); | 1123 | genclk_init_parent(&atmel_lcdfb0_pixclk); |
1081 | 1124 | ||
1082 | /* | 1125 | /* |
1083 | * Turn on all clocks that have at least one user already, and | 1126 | * Turn on all clocks that have at least one user already, and |
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c index 88b00b15970f..e011f1ce1875 100644 --- a/arch/avr32/mm/fault.c +++ b/arch/avr32/mm/fault.c | |||
@@ -12,41 +12,30 @@ | |||
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
15 | |||
16 | #include <linux/kdebug.h> | 15 | #include <linux/kdebug.h> |
16 | #include <linux/kprobes.h> | ||
17 | |||
17 | #include <asm/mmu_context.h> | 18 | #include <asm/mmu_context.h> |
18 | #include <asm/sysreg.h> | 19 | #include <asm/sysreg.h> |
19 | #include <asm/tlb.h> | 20 | #include <asm/tlb.h> |
20 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
21 | 22 | ||
22 | #ifdef CONFIG_KPROBES | 23 | #ifdef CONFIG_KPROBES |
23 | ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain); | 24 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
24 | |||
25 | /* Hook to register for page fault notifications */ | ||
26 | int register_page_fault_notifier(struct notifier_block *nb) | ||
27 | { | 25 | { |
28 | return atomic_notifier_chain_register(¬ify_page_fault_chain, nb); | 26 | int ret = 0; |
29 | } | ||
30 | 27 | ||
31 | int unregister_page_fault_notifier(struct notifier_block *nb) | 28 | if (!user_mode(regs)) { |
32 | { | 29 | if (kprobe_running() && kprobe_fault_handler(regs, trap)) |
33 | return atomic_notifier_chain_unregister(¬ify_page_fault_chain, nb); | 30 | ret = 1; |
34 | } | 31 | } |
35 | 32 | ||
36 | static inline int notify_page_fault(enum die_val val, struct pt_regs *regs, | 33 | return ret; |
37 | int trap, int sig) | ||
38 | { | ||
39 | struct die_args args = { | ||
40 | .regs = regs, | ||
41 | .trapnr = trap, | ||
42 | }; | ||
43 | return atomic_notifier_call_chain(¬ify_page_fault_chain, val, &args); | ||
44 | } | 34 | } |
45 | #else | 35 | #else |
46 | static inline int notify_page_fault(enum die_val val, struct pt_regs *regs, | 36 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
47 | int trap, int sig) | ||
48 | { | 37 | { |
49 | return NOTIFY_DONE; | 38 | return 0; |
50 | } | 39 | } |
51 | #endif | 40 | #endif |
52 | 41 | ||
@@ -76,8 +65,7 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs) | |||
76 | long signr; | 65 | long signr; |
77 | int code; | 66 | int code; |
78 | 67 | ||
79 | if (notify_page_fault(DIE_PAGE_FAULT, regs, | 68 | if (notify_page_fault(regs, ecr)) |
80 | ecr, SIGSEGV) == NOTIFY_STOP) | ||
81 | return; | 69 | return; |
82 | 70 | ||
83 | address = sysreg_read(TLBEAR); | 71 | address = sysreg_read(TLBEAR); |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 3549c94467b8..c4784494970e 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -791,7 +791,7 @@ static __init int setup_additional_cpus(char *s) | |||
791 | early_param("additional_cpus", setup_additional_cpus); | 791 | early_param("additional_cpus", setup_additional_cpus); |
792 | 792 | ||
793 | /* | 793 | /* |
794 | * cpu_possible_map should be static, it cannot change as cpu's | 794 | * cpu_possible_map should be static, it cannot change as CPUs |
795 | * are onlined, or offlined. The reason is per-cpu data-structures | 795 | * are onlined, or offlined. The reason is per-cpu data-structures |
796 | * are allocated by some modules at init time, and dont expect to | 796 | * are allocated by some modules at init time, and dont expect to |
797 | * do this dynamically on cpu arrival/departure. | 797 | * do this dynamically on cpu arrival/departure. |
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c index aeb79fb28f0b..1d64ef478dde 100644 --- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c | |||
@@ -156,24 +156,30 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data) | |||
156 | if (!kdump_on_init) | 156 | if (!kdump_on_init) |
157 | return NOTIFY_DONE; | 157 | return NOTIFY_DONE; |
158 | 158 | ||
159 | if (val != DIE_INIT_MONARCH_ENTER && | 159 | if (val != DIE_INIT_MONARCH_LEAVE && |
160 | val != DIE_INIT_SLAVE_ENTER && | 160 | val != DIE_INIT_SLAVE_LEAVE && |
161 | val != DIE_INIT_MONARCH_PROCESS && | ||
161 | val != DIE_MCA_RENDZVOUS_LEAVE && | 162 | val != DIE_MCA_RENDZVOUS_LEAVE && |
162 | val != DIE_MCA_MONARCH_LEAVE) | 163 | val != DIE_MCA_MONARCH_LEAVE) |
163 | return NOTIFY_DONE; | 164 | return NOTIFY_DONE; |
164 | 165 | ||
165 | nd = (struct ia64_mca_notify_die *)args->err; | 166 | nd = (struct ia64_mca_notify_die *)args->err; |
166 | /* Reason code 1 means machine check rendezous*/ | 167 | /* Reason code 1 means machine check rendezvous*/ |
167 | if ((val == DIE_INIT_MONARCH_ENTER || val == DIE_INIT_SLAVE_ENTER) && | 168 | if ((val == DIE_INIT_MONARCH_LEAVE || val == DIE_INIT_SLAVE_LEAVE |
168 | nd->sos->rv_rc == 1) | 169 | || val == DIE_INIT_MONARCH_PROCESS) && nd->sos->rv_rc == 1) |
169 | return NOTIFY_DONE; | 170 | return NOTIFY_DONE; |
170 | 171 | ||
171 | switch (val) { | 172 | switch (val) { |
172 | case DIE_INIT_MONARCH_ENTER: | 173 | case DIE_INIT_MONARCH_PROCESS: |
174 | atomic_set(&kdump_in_progress, 1); | ||
175 | *(nd->monarch_cpu) = -1; | ||
176 | break; | ||
177 | case DIE_INIT_MONARCH_LEAVE: | ||
173 | machine_kdump_on_init(); | 178 | machine_kdump_on_init(); |
174 | break; | 179 | break; |
175 | case DIE_INIT_SLAVE_ENTER: | 180 | case DIE_INIT_SLAVE_LEAVE: |
176 | unw_init_running(kdump_cpu_freeze, NULL); | 181 | if (atomic_read(&kdump_in_progress)) |
182 | unw_init_running(kdump_cpu_freeze, NULL); | ||
177 | break; | 183 | break; |
178 | case DIE_MCA_RENDZVOUS_LEAVE: | 184 | case DIE_MCA_RENDZVOUS_LEAVE: |
179 | if (atomic_read(&kdump_in_progress)) | 185 | if (atomic_read(&kdump_in_progress)) |
@@ -215,8 +221,10 @@ static ctl_table sys_table[] = { | |||
215 | static int | 221 | static int |
216 | machine_crash_setup(void) | 222 | machine_crash_setup(void) |
217 | { | 223 | { |
224 | /* be notified before default_monarch_init_process */ | ||
218 | static struct notifier_block kdump_init_notifier_nb = { | 225 | static struct notifier_block kdump_init_notifier_nb = { |
219 | .notifier_call = kdump_init_notifier, | 226 | .notifier_call = kdump_init_notifier, |
227 | .priority = 1, | ||
220 | }; | 228 | }; |
221 | int ret; | 229 | int ret; |
222 | if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0) | 230 | if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0) |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 144b056282af..95f517515235 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1585,5 +1585,8 @@ sys_call_table: | |||
1585 | data8 sys_getcpu | 1585 | data8 sys_getcpu |
1586 | data8 sys_epoll_pwait // 1305 | 1586 | data8 sys_epoll_pwait // 1305 |
1587 | data8 sys_utimensat | 1587 | data8 sys_utimensat |
1588 | data8 sys_signalfd | ||
1589 | data8 sys_timerfd | ||
1590 | data8 sys_eventfd | ||
1588 | 1591 | ||
1589 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls | 1592 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index b4c239685d2e..407b45870489 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar | 4 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar |
5 | * | 5 | * |
6 | * This file contains the code used by various IRQ handling routines: | 6 | * This file contains the code used by various IRQ handling routines: |
7 | * asking for different IRQ's should be done through these routines | 7 | * asking for different IRQs should be done through these routines |
8 | * instead of just grabbing them. Thus setups with different IRQ numbers | 8 | * instead of just grabbing them. Thus setups with different IRQ numbers |
9 | * shouldn't result in any weird surprises, and installing new handlers | 9 | * shouldn't result in any weird surprises, and installing new handlers |
10 | * should be easier. | 10 | * should be easier. |
@@ -12,7 +12,7 @@ | |||
12 | * Copyright (C) Ashok Raj<ashok.raj@intel.com>, Intel Corporation 2004 | 12 | * Copyright (C) Ashok Raj<ashok.raj@intel.com>, Intel Corporation 2004 |
13 | * | 13 | * |
14 | * 4/14/2004: Added code to handle cpu migration and do safe irq | 14 | * 4/14/2004: Added code to handle cpu migration and do safe irq |
15 | * migration without lossing interrupts for iosapic | 15 | * migration without losing interrupts for iosapic |
16 | * architecture. | 16 | * architecture. |
17 | */ | 17 | */ |
18 | 18 | ||
@@ -190,7 +190,7 @@ void fixup_irqs(void) | |||
190 | } | 190 | } |
191 | 191 | ||
192 | /* | 192 | /* |
193 | * Phase 1: Locate irq's bound to this cpu and | 193 | * Phase 1: Locate IRQs bound to this cpu and |
194 | * relocate them for cpu removal. | 194 | * relocate them for cpu removal. |
195 | */ | 195 | */ |
196 | migrate_irqs(); | 196 | migrate_irqs(); |
diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index c2f07beb1759..e56a7a36aca3 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c | |||
@@ -23,7 +23,7 @@ lsapic_noop_startup (unsigned int irq) | |||
23 | static void | 23 | static void |
24 | lsapic_noop (unsigned int irq) | 24 | lsapic_noop (unsigned int irq) |
25 | { | 25 | { |
26 | /* nuthing to do... */ | 26 | /* nothing to do... */ |
27 | } | 27 | } |
28 | 28 | ||
29 | static int lsapic_retrigger(unsigned int irq) | 29 | static int lsapic_retrigger(unsigned int irq) |
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 72e593e94053..5bc46f151344 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -151,12 +151,12 @@ static uint __kprobes is_cmp_ctype_unc_inst(uint template, uint slot, | |||
151 | 151 | ||
152 | cmp_inst.l = kprobe_inst; | 152 | cmp_inst.l = kprobe_inst; |
153 | if ((cmp_inst.f.x2 == 0) || (cmp_inst.f.x2 == 1)) { | 153 | if ((cmp_inst.f.x2 == 0) || (cmp_inst.f.x2 == 1)) { |
154 | /* Integere compare - Register Register (A6 type)*/ | 154 | /* Integer compare - Register Register (A6 type)*/ |
155 | if ((cmp_inst.f.tb == 0) && (cmp_inst.f.ta == 0) | 155 | if ((cmp_inst.f.tb == 0) && (cmp_inst.f.ta == 0) |
156 | &&(cmp_inst.f.c == 1)) | 156 | &&(cmp_inst.f.c == 1)) |
157 | ctype_unc = 1; | 157 | ctype_unc = 1; |
158 | } else if ((cmp_inst.f.x2 == 2)||(cmp_inst.f.x2 == 3)) { | 158 | } else if ((cmp_inst.f.x2 == 2)||(cmp_inst.f.x2 == 3)) { |
159 | /* Integere compare - Immediate Register (A8 type)*/ | 159 | /* Integer compare - Immediate Register (A8 type)*/ |
160 | if ((cmp_inst.f.ta == 0) &&(cmp_inst.f.c == 1)) | 160 | if ((cmp_inst.f.ta == 0) &&(cmp_inst.f.c == 1)) |
161 | ctype_unc = 1; | 161 | ctype_unc = 1; |
162 | } | 162 | } |
@@ -820,7 +820,7 @@ out: | |||
820 | return 1; | 820 | return 1; |
821 | } | 821 | } |
822 | 822 | ||
823 | static int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr) | 823 | int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr) |
824 | { | 824 | { |
825 | struct kprobe *cur = kprobe_running(); | 825 | struct kprobe *cur = kprobe_running(); |
826 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 826 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
@@ -904,13 +904,6 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
904 | if (post_kprobes_handler(args->regs)) | 904 | if (post_kprobes_handler(args->regs)) |
905 | ret = NOTIFY_STOP; | 905 | ret = NOTIFY_STOP; |
906 | break; | 906 | break; |
907 | case DIE_PAGE_FAULT: | ||
908 | /* kprobe_running() needs smp_processor_id() */ | ||
909 | preempt_disable(); | ||
910 | if (kprobe_running() && | ||
911 | kprobes_fault_handler(args->regs, args->trapnr)) | ||
912 | ret = NOTIFY_STOP; | ||
913 | preempt_enable(); | ||
914 | default: | 907 | default: |
915 | break; | 908 | break; |
916 | } | 909 | } |
@@ -954,7 +947,7 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
954 | /* | 947 | /* |
955 | * Callee owns the argument space and could overwrite it, eg | 948 | * Callee owns the argument space and could overwrite it, eg |
956 | * tail call optimization. So to be absolutely safe | 949 | * tail call optimization. So to be absolutely safe |
957 | * we save the argument space before transfering the control | 950 | * we save the argument space before transferring the control |
958 | * to instrumented jprobe function which runs in | 951 | * to instrumented jprobe function which runs in |
959 | * the process context | 952 | * the process context |
960 | */ | 953 | */ |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 26814de6c29a..1ead5ea6c5ce 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -273,7 +273,6 @@ static void ia64_mlogbuf_finish(int wait) | |||
273 | 273 | ||
274 | mlogbuf_finished = 1; | 274 | mlogbuf_finished = 1; |
275 | } | 275 | } |
276 | EXPORT_SYMBOL(ia64_mlogbuf_finish); | ||
277 | 276 | ||
278 | /* | 277 | /* |
279 | * Print buffered messages from INIT context. | 278 | * Print buffered messages from INIT context. |
@@ -1477,6 +1476,10 @@ default_monarch_init_process(struct notifier_block *self, unsigned long val, voi | |||
1477 | struct task_struct *g, *t; | 1476 | struct task_struct *g, *t; |
1478 | if (val != DIE_INIT_MONARCH_PROCESS) | 1477 | if (val != DIE_INIT_MONARCH_PROCESS) |
1479 | return NOTIFY_DONE; | 1478 | return NOTIFY_DONE; |
1479 | #ifdef CONFIG_KEXEC | ||
1480 | if (atomic_read(&kdump_in_progress)) | ||
1481 | return NOTIFY_DONE; | ||
1482 | #endif | ||
1480 | 1483 | ||
1481 | /* | 1484 | /* |
1482 | * FIXME: mlogbuf will brim over with INIT stack dumps. | 1485 | * FIXME: mlogbuf will brim over with INIT stack dumps. |
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index 70b8bdbb7e6f..aba813c2c150 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c | |||
@@ -438,7 +438,7 @@ is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci, | |||
438 | * @peidx: pointer of index of processor error section | 438 | * @peidx: pointer of index of processor error section |
439 | * | 439 | * |
440 | * Return value: | 440 | * Return value: |
441 | * target address on Success / 0 on Failue | 441 | * target address on Success / 0 on Failure |
442 | */ | 442 | */ |
443 | static u64 | 443 | static u64 |
444 | get_target_identifier(peidx_table_t *peidx) | 444 | get_target_identifier(peidx_table_t *peidx) |
@@ -701,7 +701,7 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, | |||
701 | return fatal_mca("External bus check fatal status"); | 701 | return fatal_mca("External bus check fatal status"); |
702 | 702 | ||
703 | /* | 703 | /* |
704 | * This is a local MCA and estimated as a recoverble error. | 704 | * This is a local MCA and estimated as a recoverable error. |
705 | */ | 705 | */ |
706 | if (platform) | 706 | if (platform) |
707 | return recover_from_platform_error(slidx, peidx, pbci, sos); | 707 | return recover_from_platform_error(slidx, peidx, pbci, sos); |
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index 158e3c51bb77..196287928bae 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -861,7 +861,7 @@ apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
861 | /* | 861 | /* |
862 | * Modules contain a single unwind table which covers both the core and the init text | 862 | * Modules contain a single unwind table which covers both the core and the init text |
863 | * sections but since the two are not contiguous, we need to split this table up such that | 863 | * sections but since the two are not contiguous, we need to split this table up such that |
864 | * we can register (and unregister) each "segment" seperately. Fortunately, this sounds | 864 | * we can register (and unregister) each "segment" separately. Fortunately, this sounds |
865 | * more complicated than it really is. | 865 | * more complicated than it really is. |
866 | */ | 866 | */ |
867 | static void | 867 | static void |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index e7191ca30b16..b7133cabdbea 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -1318,7 +1318,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu) | |||
1318 | { | 1318 | { |
1319 | unsigned long flags; | 1319 | unsigned long flags; |
1320 | /* | 1320 | /* |
1321 | * validy checks on cpu_mask have been done upstream | 1321 | * validity checks on cpu_mask have been done upstream |
1322 | */ | 1322 | */ |
1323 | LOCK_PFS(flags); | 1323 | LOCK_PFS(flags); |
1324 | 1324 | ||
@@ -1384,7 +1384,7 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu) | |||
1384 | { | 1384 | { |
1385 | unsigned long flags; | 1385 | unsigned long flags; |
1386 | /* | 1386 | /* |
1387 | * validy checks on cpu_mask have been done upstream | 1387 | * validity checks on cpu_mask have been done upstream |
1388 | */ | 1388 | */ |
1389 | LOCK_PFS(flags); | 1389 | LOCK_PFS(flags); |
1390 | 1390 | ||
@@ -1835,7 +1835,7 @@ pfm_flush(struct file *filp, fl_owner_t id) | |||
1835 | /* | 1835 | /* |
1836 | * remove our file from the async queue, if we use this mode. | 1836 | * remove our file from the async queue, if we use this mode. |
1837 | * This can be done without the context being protected. We come | 1837 | * This can be done without the context being protected. We come |
1838 | * here when the context has become unreacheable by other tasks. | 1838 | * here when the context has become unreachable by other tasks. |
1839 | * | 1839 | * |
1840 | * We may still have active monitoring at this point and we may | 1840 | * We may still have active monitoring at this point and we may |
1841 | * end up in pfm_overflow_handler(). However, fasync_helper() | 1841 | * end up in pfm_overflow_handler(). However, fasync_helper() |
@@ -2132,7 +2132,7 @@ doit: | |||
2132 | filp->private_data = NULL; | 2132 | filp->private_data = NULL; |
2133 | 2133 | ||
2134 | /* | 2134 | /* |
2135 | * if we free on the spot, the context is now completely unreacheable | 2135 | * if we free on the spot, the context is now completely unreachable |
2136 | * from the callers side. The monitored task side is also cut, so we | 2136 | * from the callers side. The monitored task side is also cut, so we |
2137 | * can freely cut. | 2137 | * can freely cut. |
2138 | * | 2138 | * |
@@ -2562,7 +2562,7 @@ pfm_reset_pmu_state(pfm_context_t *ctx) | |||
2562 | ctx->ctx_all_pmcs[0] = pmu_conf->impl_pmcs[0] & ~0x1; | 2562 | ctx->ctx_all_pmcs[0] = pmu_conf->impl_pmcs[0] & ~0x1; |
2563 | 2563 | ||
2564 | /* | 2564 | /* |
2565 | * bitmask of all PMDs that are accesible to this context | 2565 | * bitmask of all PMDs that are accessible to this context |
2566 | */ | 2566 | */ |
2567 | ctx->ctx_all_pmds[0] = pmu_conf->impl_pmds[0]; | 2567 | ctx->ctx_all_pmds[0] = pmu_conf->impl_pmds[0]; |
2568 | 2568 | ||
@@ -3395,7 +3395,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs) | |||
3395 | if (unlikely(!PMD_IS_IMPL(cnum))) goto error; | 3395 | if (unlikely(!PMD_IS_IMPL(cnum))) goto error; |
3396 | /* | 3396 | /* |
3397 | * we can only read the register that we use. That includes | 3397 | * we can only read the register that we use. That includes |
3398 | * the one we explicitely initialize AND the one we want included | 3398 | * the one we explicitly initialize AND the one we want included |
3399 | * in the sampling buffer (smpl_regs). | 3399 | * in the sampling buffer (smpl_regs). |
3400 | * | 3400 | * |
3401 | * Having this restriction allows optimization in the ctxsw routine | 3401 | * Having this restriction allows optimization in the ctxsw routine |
@@ -3715,7 +3715,7 @@ pfm_restart(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs) | |||
3715 | * if non-blocking, then we ensure that the task will go into | 3715 | * if non-blocking, then we ensure that the task will go into |
3716 | * pfm_handle_work() before returning to user mode. | 3716 | * pfm_handle_work() before returning to user mode. |
3717 | * | 3717 | * |
3718 | * We cannot explicitely reset another task, it MUST always | 3718 | * We cannot explicitly reset another task, it MUST always |
3719 | * be done by the task itself. This works for system wide because | 3719 | * be done by the task itself. This works for system wide because |
3720 | * the tool that is controlling the session is logically doing | 3720 | * the tool that is controlling the session is logically doing |
3721 | * "self-monitoring". | 3721 | * "self-monitoring". |
@@ -4644,7 +4644,7 @@ pfm_exit_thread(struct task_struct *task) | |||
4644 | switch(state) { | 4644 | switch(state) { |
4645 | case PFM_CTX_UNLOADED: | 4645 | case PFM_CTX_UNLOADED: |
4646 | /* | 4646 | /* |
4647 | * only comes to thios function if pfm_context is not NULL, i.e., cannot | 4647 | * only comes to this function if pfm_context is not NULL, i.e., cannot |
4648 | * be in unloaded state | 4648 | * be in unloaded state |
4649 | */ | 4649 | */ |
4650 | printk(KERN_ERR "perfmon: pfm_exit_thread [%d] ctx unloaded\n", task->pid); | 4650 | printk(KERN_ERR "perfmon: pfm_exit_thread [%d] ctx unloaded\n", task->pid); |
@@ -5247,7 +5247,7 @@ pfm_end_notify_user(pfm_context_t *ctx) | |||
5247 | 5247 | ||
5248 | /* | 5248 | /* |
5249 | * main overflow processing routine. | 5249 | * main overflow processing routine. |
5250 | * it can be called from the interrupt path or explicitely during the context switch code | 5250 | * it can be called from the interrupt path or explicitly during the context switch code |
5251 | */ | 5251 | */ |
5252 | static void | 5252 | static void |
5253 | pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, struct pt_regs *regs) | 5253 | pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, struct pt_regs *regs) |
diff --git a/arch/ia64/kernel/perfmon_mckinley.h b/arch/ia64/kernel/perfmon_mckinley.h index 9becccda2897..c4bec7a9d18f 100644 --- a/arch/ia64/kernel/perfmon_mckinley.h +++ b/arch/ia64/kernel/perfmon_mckinley.h | |||
@@ -181,7 +181,7 @@ static pmu_config_t pmu_conf_mck={ | |||
181 | .pmc_desc = pfm_mck_pmc_desc, | 181 | .pmc_desc = pfm_mck_pmc_desc, |
182 | .num_ibrs = 8, | 182 | .num_ibrs = 8, |
183 | .num_dbrs = 8, | 183 | .num_dbrs = 8, |
184 | .use_rr_dbregs = 1 /* debug register are use for range retrictions */ | 184 | .use_rr_dbregs = 1 /* debug register are use for range restrictions */ |
185 | }; | 185 | }; |
186 | 186 | ||
187 | 187 | ||
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index 37c876f95dba..27c2ef445a56 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -134,7 +134,7 @@ set_smp_redirect (int flag) | |||
134 | * interrupt redirection. The reason is this would require that | 134 | * interrupt redirection. The reason is this would require that |
135 | * All interrupts be stopped and hard bind the irq to a cpu. | 135 | * All interrupts be stopped and hard bind the irq to a cpu. |
136 | * Later when the interrupt is fired we need to set the redir hint | 136 | * Later when the interrupt is fired we need to set the redir hint |
137 | * on again in the vector. This is combersome for something that the | 137 | * on again in the vector. This is cumbersome for something that the |
138 | * user mode irq balancer will solve anyways. | 138 | * user mode irq balancer will solve anyways. |
139 | */ | 139 | */ |
140 | no_int_routing=1; | 140 | no_int_routing=1; |
diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c index 89f6b138a62c..25cd75f50ab1 100644 --- a/arch/ia64/kernel/salinfo.c +++ b/arch/ia64/kernel/salinfo.c | |||
@@ -162,7 +162,7 @@ static DEFINE_SPINLOCK(data_saved_lock); | |||
162 | /** salinfo_platform_oemdata - optional callback to decode oemdata from an error | 162 | /** salinfo_platform_oemdata - optional callback to decode oemdata from an error |
163 | * record. | 163 | * record. |
164 | * @sect_header: pointer to the start of the section to decode. | 164 | * @sect_header: pointer to the start of the section to decode. |
165 | * @oemdata: returns vmalloc area containing the decded output. | 165 | * @oemdata: returns vmalloc area containing the decoded output. |
166 | * @oemdata_size: returns length of decoded output (strlen). | 166 | * @oemdata_size: returns length of decoded output (strlen). |
167 | * | 167 | * |
168 | * Description: If user space asks for oem data to be decoded by the kernel | 168 | * Description: If user space asks for oem data to be decoded by the kernel |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 9df1efe7487d..eaa6a24bc0b6 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -576,7 +576,7 @@ setup_arch (char **cmdline_p) | |||
576 | } | 576 | } |
577 | 577 | ||
578 | /* | 578 | /* |
579 | * Display cpu info for all cpu's. | 579 | * Display cpu info for all CPUs. |
580 | */ | 580 | */ |
581 | static int | 581 | static int |
582 | show_cpuinfo (struct seq_file *m, void *v) | 582 | show_cpuinfo (struct seq_file *m, void *v) |
@@ -761,7 +761,7 @@ identify_cpu (struct cpuinfo_ia64 *c) | |||
761 | c->cpu = smp_processor_id(); | 761 | c->cpu = smp_processor_id(); |
762 | 762 | ||
763 | /* below default values will be overwritten by identify_siblings() | 763 | /* below default values will be overwritten by identify_siblings() |
764 | * for Multi-Threading/Multi-Core capable cpu's | 764 | * for Multi-Threading/Multi-Core capable CPUs |
765 | */ | 765 | */ |
766 | c->threads_per_core = c->cores_per_socket = c->num_log = 1; | 766 | c->threads_per_core = c->cores_per_socket = c->num_log = 1; |
767 | c->socket_id = -1; | 767 | c->socket_id = -1; |
@@ -947,7 +947,7 @@ cpu_init (void) | |||
947 | ia32_cpu_init(); | 947 | ia32_cpu_init(); |
948 | #endif | 948 | #endif |
949 | 949 | ||
950 | /* Clear ITC to eliminiate sched_clock() overflows in human time. */ | 950 | /* Clear ITC to eliminate sched_clock() overflows in human time. */ |
951 | ia64_set_itc(0); | 951 | ia64_set_itc(0); |
952 | 952 | ||
953 | /* disable all local interrupt sources: */ | 953 | /* disable all local interrupt sources: */ |
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index 221de3804560..b3a47f986e1e 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
@@ -186,7 +186,7 @@ handle_IPI (int irq, void *dev_id) | |||
186 | } | 186 | } |
187 | 187 | ||
188 | /* | 188 | /* |
189 | * Called with preeemption disabled. | 189 | * Called with preemption disabled. |
190 | */ | 190 | */ |
191 | static inline void | 191 | static inline void |
192 | send_IPI_single (int dest_cpu, int op) | 192 | send_IPI_single (int dest_cpu, int op) |
@@ -196,7 +196,7 @@ send_IPI_single (int dest_cpu, int op) | |||
196 | } | 196 | } |
197 | 197 | ||
198 | /* | 198 | /* |
199 | * Called with preeemption disabled. | 199 | * Called with preemption disabled. |
200 | */ | 200 | */ |
201 | static inline void | 201 | static inline void |
202 | send_IPI_allbutself (int op) | 202 | send_IPI_allbutself (int op) |
@@ -210,7 +210,7 @@ send_IPI_allbutself (int op) | |||
210 | } | 210 | } |
211 | 211 | ||
212 | /* | 212 | /* |
213 | * Called with preeemption disabled. | 213 | * Called with preemption disabled. |
214 | */ | 214 | */ |
215 | static inline void | 215 | static inline void |
216 | send_IPI_all (int op) | 216 | send_IPI_all (int op) |
@@ -223,7 +223,7 @@ send_IPI_all (int op) | |||
223 | } | 223 | } |
224 | 224 | ||
225 | /* | 225 | /* |
226 | * Called with preeemption disabled. | 226 | * Called with preemption disabled. |
227 | */ | 227 | */ |
228 | static inline void | 228 | static inline void |
229 | send_IPI_self (int op) | 229 | send_IPI_self (int op) |
@@ -252,7 +252,7 @@ kdump_smp_send_init(void) | |||
252 | } | 252 | } |
253 | #endif | 253 | #endif |
254 | /* | 254 | /* |
255 | * Called with preeemption disabled. | 255 | * Called with preemption disabled. |
256 | */ | 256 | */ |
257 | void | 257 | void |
258 | smp_send_reschedule (int cpu) | 258 | smp_send_reschedule (int cpu) |
@@ -261,7 +261,7 @@ smp_send_reschedule (int cpu) | |||
261 | } | 261 | } |
262 | 262 | ||
263 | /* | 263 | /* |
264 | * Called with preeemption disabled. | 264 | * Called with preemption disabled. |
265 | */ | 265 | */ |
266 | static void | 266 | static void |
267 | smp_send_local_flush_tlb (int cpu) | 267 | smp_send_local_flush_tlb (int cpu) |
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index a44792d0f3a9..542958079f1b 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
@@ -694,7 +694,7 @@ int migrate_platform_irqs(unsigned int cpu) | |||
694 | set_cpei_target_cpu(new_cpei_cpu); | 694 | set_cpei_target_cpu(new_cpei_cpu); |
695 | desc = irq_desc + ia64_cpe_irq; | 695 | desc = irq_desc + ia64_cpe_irq; |
696 | /* | 696 | /* |
697 | * Switch for now, immediatly, we need to do fake intr | 697 | * Switch for now, immediately, we need to do fake intr |
698 | * as other interrupts, but need to study CPEI behaviour with | 698 | * as other interrupts, but need to study CPEI behaviour with |
699 | * polling before making changes. | 699 | * polling before making changes. |
700 | */ | 700 | */ |
@@ -840,7 +840,7 @@ __cpu_up (unsigned int cpu) | |||
840 | } | 840 | } |
841 | 841 | ||
842 | /* | 842 | /* |
843 | * Assume that CPU's have been discovered by some platform-dependent interface. For | 843 | * Assume that CPUs have been discovered by some platform-dependent interface. For |
844 | * SoftSDV/Lion, that would be ACPI. | 844 | * SoftSDV/Lion, that would be ACPI. |
845 | * | 845 | * |
846 | * Setup of the IPI irq handler is done in irq.c:init_IRQ_SMP(). | 846 | * Setup of the IPI irq handler is done in irq.c:init_IRQ_SMP(). |
@@ -854,7 +854,7 @@ init_smp_config(void) | |||
854 | } *ap_startup; | 854 | } *ap_startup; |
855 | long sal_ret; | 855 | long sal_ret; |
856 | 856 | ||
857 | /* Tell SAL where to drop the AP's. */ | 857 | /* Tell SAL where to drop the APs. */ |
858 | ap_startup = (struct fptr *) start_ap; | 858 | ap_startup = (struct fptr *) start_ap; |
859 | sal_ret = ia64_sal_set_vectors(SAL_VECTOR_OS_BOOT_RENDEZ, | 859 | sal_ret = ia64_sal_set_vectors(SAL_VECTOR_OS_BOOT_RENDEZ, |
860 | ia64_tpa(ap_startup->fp), ia64_tpa(ap_startup->gp), 0, 0, 0, 0); | 860 | ia64_tpa(ap_startup->fp), ia64_tpa(ap_startup->gp), 0, 0, 0, 0); |
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index b8e0d70bf989..15ad85da15a9 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c | |||
@@ -304,7 +304,7 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) | |||
304 | * Lower 4 bits are used as a count. Upper bits are a sequence | 304 | * Lower 4 bits are used as a count. Upper bits are a sequence |
305 | * number that is updated when count is reset. The cmpxchg will | 305 | * number that is updated when count is reset. The cmpxchg will |
306 | * fail is seqno has changed. This minimizes mutiple cpus | 306 | * fail is seqno has changed. This minimizes mutiple cpus |
307 | * reseting the count. | 307 | * resetting the count. |
308 | */ | 308 | */ |
309 | if (current_jiffies > last.time) | 309 | if (current_jiffies > last.time) |
310 | (void) cmpxchg_acq(&last.count, count, 16 + (count & ~15)); | 310 | (void) cmpxchg_acq(&last.count, count, 16 + (count & ~15)); |
diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c index fe1426266b9b..7d3dd6cdafa4 100644 --- a/arch/ia64/kernel/unwind.c +++ b/arch/ia64/kernel/unwind.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Copyright (C) 1999-2004 Hewlett-Packard Co | 2 | * Copyright (C) 1999-2004 Hewlett-Packard Co |
3 | * David Mosberger-Tang <davidm@hpl.hp.com> | 3 | * David Mosberger-Tang <davidm@hpl.hp.com> |
4 | * Copyright (C) 2003 Fenghua Yu <fenghua.yu@intel.com> | 4 | * Copyright (C) 2003 Fenghua Yu <fenghua.yu@intel.com> |
5 | * - Change pt_regs_off() to make it less dependant on pt_regs structure. | 5 | * - Change pt_regs_off() to make it less dependent on pt_regs structure. |
6 | */ | 6 | */ |
7 | /* | 7 | /* |
8 | * This file implements call frame unwind support for the Linux | 8 | * This file implements call frame unwind support for the Linux |
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 38085ac18338..0dbf0e81f8c0 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -317,7 +317,7 @@ static void __meminit scatter_node_data(void) | |||
317 | * node_online_map is not set for hot-added nodes at this time, | 317 | * node_online_map is not set for hot-added nodes at this time, |
318 | * because we are halfway through initialization of the new node's | 318 | * because we are halfway through initialization of the new node's |
319 | * structures. If for_each_online_node() is used, a new node's | 319 | * structures. If for_each_online_node() is used, a new node's |
320 | * pg_data_ptrs will be not initialized. Insted of using it, | 320 | * pg_data_ptrs will be not initialized. Instead of using it, |
321 | * pgdat_list[] is checked. | 321 | * pgdat_list[] is checked. |
322 | */ | 322 | */ |
323 | for_each_node(node) { | 323 | for_each_node(node) { |
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 21658e02116c..b87f785c2416 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
@@ -19,36 +19,24 @@ | |||
19 | extern void die (char *, struct pt_regs *, long); | 19 | extern void die (char *, struct pt_regs *, long); |
20 | 20 | ||
21 | #ifdef CONFIG_KPROBES | 21 | #ifdef CONFIG_KPROBES |
22 | ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain); | 22 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
23 | |||
24 | /* Hook to register for page fault notifications */ | ||
25 | int register_page_fault_notifier(struct notifier_block *nb) | ||
26 | { | ||
27 | return atomic_notifier_chain_register(¬ify_page_fault_chain, nb); | ||
28 | } | ||
29 | |||
30 | int unregister_page_fault_notifier(struct notifier_block *nb) | ||
31 | { | 23 | { |
32 | return atomic_notifier_chain_unregister(¬ify_page_fault_chain, nb); | 24 | int ret = 0; |
33 | } | 25 | |
26 | if (!user_mode(regs)) { | ||
27 | /* kprobe_running() needs smp_processor_id() */ | ||
28 | preempt_disable(); | ||
29 | if (kprobe_running() && kprobes_fault_handler(regs, trap)) | ||
30 | ret = 1; | ||
31 | preempt_enable(); | ||
32 | } | ||
34 | 33 | ||
35 | static inline int notify_page_fault(enum die_val val, const char *str, | 34 | return ret; |
36 | struct pt_regs *regs, long err, int trap, int sig) | ||
37 | { | ||
38 | struct die_args args = { | ||
39 | .regs = regs, | ||
40 | .str = str, | ||
41 | .err = err, | ||
42 | .trapnr = trap, | ||
43 | .signr = sig | ||
44 | }; | ||
45 | return atomic_notifier_call_chain(¬ify_page_fault_chain, val, &args); | ||
46 | } | 35 | } |
47 | #else | 36 | #else |
48 | static inline int notify_page_fault(enum die_val val, const char *str, | 37 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
49 | struct pt_regs *regs, long err, int trap, int sig) | ||
50 | { | 38 | { |
51 | return NOTIFY_DONE; | 39 | return 0; |
52 | } | 40 | } |
53 | #endif | 41 | #endif |
54 | 42 | ||
@@ -117,8 +105,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | |||
117 | /* | 105 | /* |
118 | * This is to handle the kprobes on user space access instructions | 106 | * This is to handle the kprobes on user space access instructions |
119 | */ | 107 | */ |
120 | if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, code, TRAP_BRKPT, | 108 | if (notify_page_fault(regs, TRAP_BRKPT)) |
121 | SIGSEGV) == NOTIFY_STOP) | ||
122 | return; | 109 | return; |
123 | 110 | ||
124 | down_read(&mm->mmap_sem); | 111 | down_read(&mm->mmap_sem); |
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c index ff1c55601178..b362d6d6a8c8 100644 --- a/arch/ia64/sn/kernel/bte.c +++ b/arch/ia64/sn/kernel/bte.c | |||
@@ -63,7 +63,7 @@ static inline void bte_start_transfer(struct bteinfo_s *bte, u64 len, u64 mode) | |||
63 | * Use the block transfer engine to move kernel memory from src to dest | 63 | * Use the block transfer engine to move kernel memory from src to dest |
64 | * using the assigned mode. | 64 | * using the assigned mode. |
65 | * | 65 | * |
66 | * Paramaters: | 66 | * Parameters: |
67 | * src - physical address of the transfer source. | 67 | * src - physical address of the transfer source. |
68 | * dest - physical address of the transfer destination. | 68 | * dest - physical address of the transfer destination. |
69 | * len - number of bytes to transfer from source to dest. | 69 | * len - number of bytes to transfer from source to dest. |
@@ -247,7 +247,7 @@ EXPORT_SYMBOL(bte_copy); | |||
247 | * use the block transfer engine to move kernel | 247 | * use the block transfer engine to move kernel |
248 | * memory from src to dest using the assigned mode. | 248 | * memory from src to dest using the assigned mode. |
249 | * | 249 | * |
250 | * Paramaters: | 250 | * Parameters: |
251 | * src - physical address of the transfer source. | 251 | * src - physical address of the transfer source. |
252 | * dest - physical address of the transfer destination. | 252 | * dest - physical address of the transfer destination. |
253 | * len - number of bytes to transfer from source to dest. | 253 | * len - number of bytes to transfer from source to dest. |
@@ -255,7 +255,7 @@ EXPORT_SYMBOL(bte_copy); | |||
255 | * for IBCT0/1 in the SGI documentation. | 255 | * for IBCT0/1 in the SGI documentation. |
256 | * | 256 | * |
257 | * NOTE: If the source, dest, and len are all cache line aligned, | 257 | * NOTE: If the source, dest, and len are all cache line aligned, |
258 | * then it would be _FAR_ preferrable to use bte_copy instead. | 258 | * then it would be _FAR_ preferable to use bte_copy instead. |
259 | */ | 259 | */ |
260 | bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | 260 | bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) |
261 | { | 261 | { |
@@ -300,7 +300,7 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
300 | * a standard bte copy. | 300 | * a standard bte copy. |
301 | * | 301 | * |
302 | * One nasty exception to the above rule is when the | 302 | * One nasty exception to the above rule is when the |
303 | * source and destination are not symetrically | 303 | * source and destination are not symmetrically |
304 | * mis-aligned. If the source offset from the first | 304 | * mis-aligned. If the source offset from the first |
305 | * cache line is different from the destination offset, | 305 | * cache line is different from the destination offset, |
306 | * we make the first section be the entire transfer | 306 | * we make the first section be the entire transfer |
@@ -337,7 +337,7 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
337 | 337 | ||
338 | if (footBcopyDest == (headBcopyDest + headBcopyLen)) { | 338 | if (footBcopyDest == (headBcopyDest + headBcopyLen)) { |
339 | /* | 339 | /* |
340 | * We have two contigous bcopy | 340 | * We have two contiguous bcopy |
341 | * blocks. Merge them. | 341 | * blocks. Merge them. |
342 | */ | 342 | */ |
343 | headBcopyLen += footBcopyLen; | 343 | headBcopyLen += footBcopyLen; |
@@ -375,7 +375,7 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
375 | } else { | 375 | } else { |
376 | 376 | ||
377 | /* | 377 | /* |
378 | * The transfer is not symetric, we will | 378 | * The transfer is not symmetric, we will |
379 | * allocate a buffer large enough for all the | 379 | * allocate a buffer large enough for all the |
380 | * data, bte_copy into that buffer and then | 380 | * data, bte_copy into that buffer and then |
381 | * bcopy to the destination. | 381 | * bcopy to the destination. |
diff --git a/arch/ia64/sn/kernel/bte_error.c b/arch/ia64/sn/kernel/bte_error.c index b6fcf8164f2b..27c5936ccfe9 100644 --- a/arch/ia64/sn/kernel/bte_error.c +++ b/arch/ia64/sn/kernel/bte_error.c | |||
@@ -105,7 +105,7 @@ int shub1_bte_error_handler(unsigned long _nodepda) | |||
105 | } | 105 | } |
106 | 106 | ||
107 | BTE_PRINTK(("eh:%p:%d Cleaning up\n", err_nodepda, smp_processor_id())); | 107 | BTE_PRINTK(("eh:%p:%d Cleaning up\n", err_nodepda, smp_processor_id())); |
108 | /* Reenable both bte interfaces */ | 108 | /* Re-enable both bte interfaces */ |
109 | imem.ii_imem_regval = REMOTE_HUB_L(nasid, IIO_IMEM); | 109 | imem.ii_imem_regval = REMOTE_HUB_L(nasid, IIO_IMEM); |
110 | imem.ii_imem_fld_s.i_b0_esd = imem.ii_imem_fld_s.i_b1_esd = 1; | 110 | imem.ii_imem_fld_s.i_b0_esd = imem.ii_imem_fld_s.i_b1_esd = 1; |
111 | REMOTE_HUB_S(nasid, IIO_IMEM, imem.ii_imem_regval); | 111 | REMOTE_HUB_S(nasid, IIO_IMEM, imem.ii_imem_regval); |
@@ -243,7 +243,7 @@ bte_crb_error_handler(cnodeid_t cnode, int btenum, | |||
243 | 243 | ||
244 | /* | 244 | /* |
245 | * The caller has already figured out the error type, we save that | 245 | * The caller has already figured out the error type, we save that |
246 | * in the bte handle structure for the thread excercising the | 246 | * in the bte handle structure for the thread exercising the |
247 | * interface to consume. | 247 | * interface to consume. |
248 | */ | 248 | */ |
249 | bte->bh_error = ioe->ie_errortype + BTEFAIL_OFFSET; | 249 | bte->bh_error = ioe->ie_errortype + BTEFAIL_OFFSET; |
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index 7ed72d3faf73..787ed642dd49 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c | |||
@@ -479,7 +479,7 @@ sn_io_early_init(void) | |||
479 | } | 479 | } |
480 | 480 | ||
481 | /* | 481 | /* |
482 | * prime sn_pci_provider[]. Individial provider init routines will | 482 | * prime sn_pci_provider[]. Individual provider init routines will |
483 | * override their respective default entries. | 483 | * override their respective default entries. |
484 | */ | 484 | */ |
485 | 485 | ||
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index a9bed5ca2ed8..a574fcd163dd 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
@@ -167,7 +167,7 @@ void __init early_sn_setup(void) | |||
167 | * IO on SN2 is done via SAL calls, early_printk won't work without this. | 167 | * IO on SN2 is done via SAL calls, early_printk won't work without this. |
168 | * | 168 | * |
169 | * This code duplicates some of the ACPI table parsing that is in efi.c & sal.c. | 169 | * This code duplicates some of the ACPI table parsing that is in efi.c & sal.c. |
170 | * Any changes to those file may have to be made hereas well. | 170 | * Any changes to those file may have to be made here as well. |
171 | */ | 171 | */ |
172 | efi_systab = (efi_system_table_t *) __va(ia64_boot_param->efi_systab); | 172 | efi_systab = (efi_system_table_t *) __va(ia64_boot_param->efi_systab); |
173 | config_tables = __va(efi_systab->tables); | 173 | config_tables = __va(efi_systab->tables); |
diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c index 5d318b579fb1..033c8a9f000e 100644 --- a/arch/ia64/sn/kernel/sn2/sn2_smp.c +++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c | |||
@@ -104,7 +104,7 @@ static inline unsigned long wait_piowc(void) | |||
104 | * | 104 | * |
105 | * SN2 PIO writes from separate CPUs are not guaranteed to arrive in order. | 105 | * SN2 PIO writes from separate CPUs are not guaranteed to arrive in order. |
106 | * Context switching user threads which have memory-mapped MMIO may cause | 106 | * Context switching user threads which have memory-mapped MMIO may cause |
107 | * PIOs to issue from seperate CPUs, thus the PIO writes must be drained | 107 | * PIOs to issue from separate CPUs, thus the PIO writes must be drained |
108 | * from the previous CPU's Shub before execution resumes on the new CPU. | 108 | * from the previous CPU's Shub before execution resumes on the new CPU. |
109 | */ | 109 | */ |
110 | void sn_migrate(struct task_struct *task) | 110 | void sn_migrate(struct task_struct *task) |
diff --git a/arch/ia64/sn/kernel/xpc_channel.c b/arch/ia64/sn/kernel/xpc_channel.c index c08db9c2375d..44ccc0d789c9 100644 --- a/arch/ia64/sn/kernel/xpc_channel.c +++ b/arch/ia64/sn/kernel/xpc_channel.c | |||
@@ -293,7 +293,7 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst, | |||
293 | 293 | ||
294 | 294 | ||
295 | /* | 295 | /* |
296 | * Pull the remote per partititon specific variables from the specified | 296 | * Pull the remote per partition specific variables from the specified |
297 | * partition. | 297 | * partition. |
298 | */ | 298 | */ |
299 | enum xpc_retval | 299 | enum xpc_retval |
@@ -461,7 +461,7 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch) | |||
461 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between | 461 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between |
462 | // >>> iterations of the for-loop, bail if set? | 462 | // >>> iterations of the for-loop, bail if set? |
463 | 463 | ||
464 | // >>> should we impose a minumum #of entries? like 4 or 8? | 464 | // >>> should we impose a minimum #of entries? like 4 or 8? |
465 | for (nentries = ch->local_nentries; nentries > 0; nentries--) { | 465 | for (nentries = ch->local_nentries; nentries > 0; nentries--) { |
466 | 466 | ||
467 | nbytes = nentries * ch->msg_size; | 467 | nbytes = nentries * ch->msg_size; |
@@ -514,7 +514,7 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch) | |||
514 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between | 514 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between |
515 | // >>> iterations of the for-loop, bail if set? | 515 | // >>> iterations of the for-loop, bail if set? |
516 | 516 | ||
517 | // >>> should we impose a minumum #of entries? like 4 or 8? | 517 | // >>> should we impose a minimum #of entries? like 4 or 8? |
518 | for (nentries = ch->remote_nentries; nentries > 0; nentries--) { | 518 | for (nentries = ch->remote_nentries; nentries > 0; nentries--) { |
519 | 519 | ||
520 | nbytes = nentries * ch->msg_size; | 520 | nbytes = nentries * ch->msg_size; |
@@ -1478,7 +1478,7 @@ xpc_teardown_infrastructure(struct xpc_partition *part) | |||
1478 | 1478 | ||
1479 | 1479 | ||
1480 | /* | 1480 | /* |
1481 | * Before proceding with the teardown we have to wait until all | 1481 | * Before proceeding with the teardown we have to wait until all |
1482 | * existing references cease. | 1482 | * existing references cease. |
1483 | */ | 1483 | */ |
1484 | wait_event(part->teardown_wq, (atomic_read(&part->references) == 0)); | 1484 | wait_event(part->teardown_wq, (atomic_read(&part->references) == 0)); |
diff --git a/arch/ia64/sn/kernel/xpnet.c b/arch/ia64/sn/kernel/xpnet.c index da7213530972..e58fcadff2e9 100644 --- a/arch/ia64/sn/kernel/xpnet.c +++ b/arch/ia64/sn/kernel/xpnet.c | |||
@@ -531,7 +531,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
531 | dev_dbg(xpnet, "destination Partitions mask (dp) = 0x%lx\n", dp); | 531 | dev_dbg(xpnet, "destination Partitions mask (dp) = 0x%lx\n", dp); |
532 | 532 | ||
533 | /* | 533 | /* |
534 | * If we wanted to allow promiscous mode to work like an | 534 | * If we wanted to allow promiscuous mode to work like an |
535 | * unswitched network, this would be a good point to OR in a | 535 | * unswitched network, this would be a good point to OR in a |
536 | * mask of partitions which should be receiving all packets. | 536 | * mask of partitions which should be receiving all packets. |
537 | */ | 537 | */ |
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index 7a291a271511..d79ddacfba2d 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c | |||
@@ -333,7 +333,7 @@ int sn_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size) | |||
333 | /* | 333 | /* |
334 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work | 334 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work |
335 | * around hw issues at the pci bus level. SGI proms older than | 335 | * around hw issues at the pci bus level. SGI proms older than |
336 | * 4.10 don't implment this. | 336 | * 4.10 don't implement this. |
337 | */ | 337 | */ |
338 | 338 | ||
339 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, | 339 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, |
@@ -348,7 +348,7 @@ int sn_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size) | |||
348 | /* | 348 | /* |
349 | * If the above failed, retry using the SAL_PROBE call which should | 349 | * If the above failed, retry using the SAL_PROBE call which should |
350 | * be present in all proms (but which cannot work round PCI chipset | 350 | * be present in all proms (but which cannot work round PCI chipset |
351 | * bugs). This code is retained for compatability with old | 351 | * bugs). This code is retained for compatibility with old |
352 | * pre-4.10 proms, and should be removed at some point in the future. | 352 | * pre-4.10 proms, and should be removed at some point in the future. |
353 | */ | 353 | */ |
354 | 354 | ||
@@ -379,7 +379,7 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
379 | /* | 379 | /* |
380 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work | 380 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work |
381 | * around hw issues at the pci bus level. SGI proms older than | 381 | * around hw issues at the pci bus level. SGI proms older than |
382 | * 4.10 don't implment this. | 382 | * 4.10 don't implement this. |
383 | */ | 383 | */ |
384 | 384 | ||
385 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, | 385 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, |
@@ -394,7 +394,7 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
394 | /* | 394 | /* |
395 | * If the above failed, retry using the SAL_PROBE call which should | 395 | * If the above failed, retry using the SAL_PROBE call which should |
396 | * be present in all proms (but which cannot work round PCI chipset | 396 | * be present in all proms (but which cannot work round PCI chipset |
397 | * bugs). This code is retained for compatability with old | 397 | * bugs). This code is retained for compatibility with old |
398 | * pre-4.10 proms, and should be removed at some point in the future. | 398 | * pre-4.10 proms, and should be removed at some point in the future. |
399 | */ | 399 | */ |
400 | 400 | ||
diff --git a/arch/ia64/sn/pci/pcibr/pcibr_ate.c b/arch/ia64/sn/pci/pcibr/pcibr_ate.c index 935029fc400d..239b3cedcf2b 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_ate.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_ate.c | |||
@@ -30,7 +30,7 @@ static void mark_ate(struct ate_resource *ate_resource, int start, int number, | |||
30 | 30 | ||
31 | /* | 31 | /* |
32 | * find_free_ate: Find the first free ate index starting from the given | 32 | * find_free_ate: Find the first free ate index starting from the given |
33 | * index for the desired consequtive count. | 33 | * index for the desired consecutive count. |
34 | */ | 34 | */ |
35 | static int find_free_ate(struct ate_resource *ate_resource, int start, | 35 | static int find_free_ate(struct ate_resource *ate_resource, int start, |
36 | int count) | 36 | int count) |
@@ -88,7 +88,7 @@ static inline int alloc_ate_resource(struct ate_resource *ate_resource, | |||
88 | return -1; | 88 | return -1; |
89 | 89 | ||
90 | /* | 90 | /* |
91 | * Find the required number of free consequtive ates. | 91 | * Find the required number of free consecutive ates. |
92 | */ | 92 | */ |
93 | start_index = | 93 | start_index = |
94 | find_free_ate(ate_resource, ate_resource->lowest_free_index, | 94 | find_free_ate(ate_resource, ate_resource->lowest_free_index, |
@@ -105,7 +105,7 @@ static inline int alloc_ate_resource(struct ate_resource *ate_resource, | |||
105 | /* | 105 | /* |
106 | * Allocate "count" contiguous Bridge Address Translation Entries | 106 | * Allocate "count" contiguous Bridge Address Translation Entries |
107 | * on the specified bridge to be used for PCI to XTALK mappings. | 107 | * on the specified bridge to be used for PCI to XTALK mappings. |
108 | * Indices in rm map range from 1..num_entries. Indicies returned | 108 | * Indices in rm map range from 1..num_entries. Indices returned |
109 | * to caller range from 0..num_entries-1. | 109 | * to caller range from 0..num_entries-1. |
110 | * | 110 | * |
111 | * Return the start index on success, -1 on failure. | 111 | * Return the start index on success, -1 on failure. |
diff --git a/arch/ia64/sn/pci/pcibr/pcibr_dma.c b/arch/ia64/sn/pci/pcibr/pcibr_dma.c index 95af40cb22f2..e626e50a938a 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_dma.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_dma.c | |||
@@ -201,7 +201,7 @@ pcibr_dmatrans_direct32(struct pcidev_info * info, | |||
201 | } | 201 | } |
202 | 202 | ||
203 | /* | 203 | /* |
204 | * Wrapper routine for free'ing DMA maps | 204 | * Wrapper routine for freeing DMA maps |
205 | * DMA mappings for Direct 64 and 32 do not have any DMA maps. | 205 | * DMA mappings for Direct 64 and 32 do not have any DMA maps. |
206 | */ | 206 | */ |
207 | void | 207 | void |
diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c index 8a2cb4e691fd..b9bedbd6e1d6 100644 --- a/arch/ia64/sn/pci/tioca_provider.c +++ b/arch/ia64/sn/pci/tioca_provider.c | |||
@@ -223,7 +223,7 @@ tioca_fastwrite_enable(struct tioca_kernel *tioca_kern) | |||
223 | 223 | ||
224 | /* | 224 | /* |
225 | * Scan all vga controllers on this bus making sure they all | 225 | * Scan all vga controllers on this bus making sure they all |
226 | * suport FW. If not, return. | 226 | * support FW. If not, return. |
227 | */ | 227 | */ |
228 | 228 | ||
229 | list_for_each_entry(pdev, tioca_kern->ca_devices, bus_list) { | 229 | list_for_each_entry(pdev, tioca_kern->ca_devices, bus_list) { |
@@ -364,7 +364,7 @@ tioca_dma_d48(struct pci_dev *pdev, u64 paddr) | |||
364 | * @req_size: len (bytes) to map | 364 | * @req_size: len (bytes) to map |
365 | * | 365 | * |
366 | * Map @paddr into CA address space using the GART mechanism. The mapped | 366 | * Map @paddr into CA address space using the GART mechanism. The mapped |
367 | * dma_addr_t is guarenteed to be contiguous in CA bus space. | 367 | * dma_addr_t is guaranteed to be contiguous in CA bus space. |
368 | */ | 368 | */ |
369 | static dma_addr_t | 369 | static dma_addr_t |
370 | tioca_dma_mapped(struct pci_dev *pdev, u64 paddr, size_t req_size) | 370 | tioca_dma_mapped(struct pci_dev *pdev, u64 paddr, size_t req_size) |
@@ -526,7 +526,7 @@ tioca_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags) | |||
526 | return 0; | 526 | return 0; |
527 | 527 | ||
528 | /* | 528 | /* |
529 | * If card is 64 or 48 bit addresable, use a direct mapping. 32 | 529 | * If card is 64 or 48 bit addressable, use a direct mapping. 32 |
530 | * bit direct is so restrictive w.r.t. where the memory resides that | 530 | * bit direct is so restrictive w.r.t. where the memory resides that |
531 | * we don't use it even though CA has some support. | 531 | * we don't use it even though CA has some support. |
532 | */ | 532 | */ |
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c index 35f854fb6120..f4c0b961a939 100644 --- a/arch/ia64/sn/pci/tioce_provider.c +++ b/arch/ia64/sn/pci/tioce_provider.c | |||
@@ -256,9 +256,9 @@ pcidev_to_tioce(struct pci_dev *pdev, struct tioce __iomem **base, | |||
256 | * @ct_addr: the coretalk address to map | 256 | * @ct_addr: the coretalk address to map |
257 | * @len: number of bytes to map | 257 | * @len: number of bytes to map |
258 | * | 258 | * |
259 | * Given the addressing type, set up various paramaters that define the | 259 | * Given the addressing type, set up various parameters that define the |
260 | * ATE pool to use. Search for a contiguous block of entries to cover the | 260 | * ATE pool to use. Search for a contiguous block of entries to cover the |
261 | * length, and if enough resources exist, fill in the ATE's and construct a | 261 | * length, and if enough resources exist, fill in the ATEs and construct a |
262 | * tioce_dmamap struct to track the mapping. | 262 | * tioce_dmamap struct to track the mapping. |
263 | */ | 263 | */ |
264 | static u64 | 264 | static u64 |
@@ -581,8 +581,8 @@ tioce_do_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, | |||
581 | */ | 581 | */ |
582 | if (!mapaddr && !barrier && dma_mask >= 0xffffffffffUL) { | 582 | if (!mapaddr && !barrier && dma_mask >= 0xffffffffffUL) { |
583 | /* | 583 | /* |
584 | * We have two options for 40-bit mappings: 16GB "super" ATE's | 584 | * We have two options for 40-bit mappings: 16GB "super" ATEs |
585 | * and 64MB "regular" ATE's. We'll try both if needed for a | 585 | * and 64MB "regular" ATEs. We'll try both if needed for a |
586 | * given mapping but which one we try first depends on the | 586 | * given mapping but which one we try first depends on the |
587 | * size. For requests >64MB, prefer to use a super page with | 587 | * size. For requests >64MB, prefer to use a super page with |
588 | * regular as the fallback. Otherwise, try in the reverse order. | 588 | * regular as the fallback. Otherwise, try in the reverse order. |
@@ -687,8 +687,8 @@ tioce_error_intr_handler(int irq, void *arg) | |||
687 | } | 687 | } |
688 | 688 | ||
689 | /** | 689 | /** |
690 | * tioce_reserve_m32 - reserve M32 ate's for the indicated address range | 690 | * tioce_reserve_m32 - reserve M32 ATEs for the indicated address range |
691 | * @tioce_kernel: TIOCE context to reserve ate's for | 691 | * @tioce_kernel: TIOCE context to reserve ATEs for |
692 | * @base: starting bus address to reserve | 692 | * @base: starting bus address to reserve |
693 | * @limit: last bus address to reserve | 693 | * @limit: last bus address to reserve |
694 | * | 694 | * |
@@ -763,7 +763,7 @@ tioce_kern_init(struct tioce_common *tioce_common) | |||
763 | 763 | ||
764 | /* | 764 | /* |
765 | * Set PMU pagesize to the largest size available, and zero out | 765 | * Set PMU pagesize to the largest size available, and zero out |
766 | * the ate's. | 766 | * the ATEs. |
767 | */ | 767 | */ |
768 | 768 | ||
769 | tioce_mmr = (struct tioce __iomem *)tioce_common->ce_pcibus.bs_base; | 769 | tioce_mmr = (struct tioce __iomem *)tioce_common->ce_pcibus.bs_base; |
@@ -784,7 +784,7 @@ tioce_kern_init(struct tioce_common *tioce_common) | |||
784 | } | 784 | } |
785 | 785 | ||
786 | /* | 786 | /* |
787 | * Reserve ATE's corresponding to reserved address ranges. These | 787 | * Reserve ATEs corresponding to reserved address ranges. These |
788 | * include: | 788 | * include: |
789 | * | 789 | * |
790 | * Memory space covered by each PPB mem base/limit register | 790 | * Memory space covered by each PPB mem base/limit register |
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile index 6bf6fb65bc20..c749dccacc32 100644 --- a/arch/sparc64/kernel/Makefile +++ b/arch/sparc64/kernel/Makefile | |||
@@ -12,7 +12,7 @@ obj-y := process.o setup.o cpu.o idprom.o \ | |||
12 | irq.o ptrace.o time.o sys_sparc.o signal.o \ | 12 | irq.o ptrace.o time.o sys_sparc.o signal.o \ |
13 | unaligned.o central.o pci.o starfire.o semaphore.o \ | 13 | unaligned.o central.o pci.o starfire.o semaphore.o \ |
14 | power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \ | 14 | power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \ |
15 | visemul.o prom.o of_device.o | 15 | visemul.o prom.o of_device.o hvapi.o |
16 | 16 | ||
17 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | 17 | obj-$(CONFIG_STACKTRACE) += stacktrace.o |
18 | obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o pci_iommu.o \ | 18 | obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o pci_iommu.o \ |
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index c15a3edcb826..732b77cb71f8 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -1843,3 +1843,97 @@ sun4v_cpu_state: | |||
1843 | mov %o1, %o0 | 1843 | mov %o1, %o0 |
1844 | 1: retl | 1844 | 1: retl |
1845 | nop | 1845 | nop |
1846 | |||
1847 | /* %o0: API group number | ||
1848 | * %o1: pointer to unsigned long major number storage | ||
1849 | * %o2: pointer to unsigned long minor number storage | ||
1850 | * | ||
1851 | * returns %o0: status | ||
1852 | */ | ||
1853 | .globl sun4v_get_version | ||
1854 | sun4v_get_version: | ||
1855 | mov HV_CORE_GET_VER, %o5 | ||
1856 | mov %o1, %o3 | ||
1857 | mov %o2, %o4 | ||
1858 | ta HV_CORE_TRAP | ||
1859 | stx %o1, [%o3] | ||
1860 | retl | ||
1861 | stx %o2, [%o4] | ||
1862 | |||
1863 | /* %o0: API group number | ||
1864 | * %o1: desired major number | ||
1865 | * %o2: desired minor number | ||
1866 | * %o3: pointer to unsigned long actual minor number storage | ||
1867 | * | ||
1868 | * returns %o0: status | ||
1869 | */ | ||
1870 | .globl sun4v_set_version | ||
1871 | sun4v_set_version: | ||
1872 | mov HV_CORE_SET_VER, %o5 | ||
1873 | mov %o3, %o4 | ||
1874 | ta HV_CORE_TRAP | ||
1875 | retl | ||
1876 | stx %o1, [%o4] | ||
1877 | |||
1878 | /* %o0: pointer to unsigned long status | ||
1879 | * | ||
1880 | * returns %o0: signed character | ||
1881 | */ | ||
1882 | .globl sun4v_con_getchar | ||
1883 | sun4v_con_getchar: | ||
1884 | mov %o0, %o4 | ||
1885 | mov HV_FAST_CONS_GETCHAR, %o5 | ||
1886 | clr %o0 | ||
1887 | clr %o1 | ||
1888 | ta HV_FAST_TRAP | ||
1889 | stx %o0, [%o4] | ||
1890 | retl | ||
1891 | sra %o1, 0, %o0 | ||
1892 | |||
1893 | /* %o0: signed long character | ||
1894 | * | ||
1895 | * returns %o0: status | ||
1896 | */ | ||
1897 | .globl sun4v_con_putchar | ||
1898 | sun4v_con_putchar: | ||
1899 | mov HV_FAST_CONS_PUTCHAR, %o5 | ||
1900 | ta HV_FAST_TRAP | ||
1901 | retl | ||
1902 | sra %o0, 0, %o0 | ||
1903 | |||
1904 | /* %o0: buffer real address | ||
1905 | * %o1: buffer size | ||
1906 | * %o2: pointer to unsigned long bytes_read | ||
1907 | * | ||
1908 | * returns %o0: status | ||
1909 | */ | ||
1910 | .globl sun4v_con_read | ||
1911 | sun4v_con_read: | ||
1912 | mov %o2, %o4 | ||
1913 | mov HV_FAST_CONS_READ, %o5 | ||
1914 | ta HV_FAST_TRAP | ||
1915 | brnz %o0, 1f | ||
1916 | cmp %o1, -1 /* break */ | ||
1917 | be,a,pn %icc, 1f | ||
1918 | mov %o1, %o0 | ||
1919 | cmp %o1, -2 /* hup */ | ||
1920 | be,a,pn %icc, 1f | ||
1921 | mov %o1, %o0 | ||
1922 | stx %o1, [%o4] | ||
1923 | 1: retl | ||
1924 | nop | ||
1925 | |||
1926 | /* %o0: buffer real address | ||
1927 | * %o1: buffer size | ||
1928 | * %o2: pointer to unsigned long bytes_written | ||
1929 | * | ||
1930 | * returns %o0: status | ||
1931 | */ | ||
1932 | .globl sun4v_con_write | ||
1933 | sun4v_con_write: | ||
1934 | mov %o2, %o4 | ||
1935 | mov HV_FAST_CONS_WRITE, %o5 | ||
1936 | ta HV_FAST_TRAP | ||
1937 | stx %o1, [%o4] | ||
1938 | retl | ||
1939 | nop | ||
diff --git a/arch/sparc64/kernel/hvapi.c b/arch/sparc64/kernel/hvapi.c new file mode 100644 index 000000000000..f03ffc829c7a --- /dev/null +++ b/arch/sparc64/kernel/hvapi.c | |||
@@ -0,0 +1,189 @@ | |||
1 | /* hvapi.c: Hypervisor API management. | ||
2 | * | ||
3 | * Copyright (C) 2007 David S. Miller <davem@davemloft.net> | ||
4 | */ | ||
5 | #include <linux/kernel.h> | ||
6 | #include <linux/module.h> | ||
7 | #include <linux/init.h> | ||
8 | #include <linux/slab.h> | ||
9 | |||
10 | #include <asm/hypervisor.h> | ||
11 | #include <asm/oplib.h> | ||
12 | |||
13 | /* If the hypervisor indicates that the API setting | ||
14 | * calls are unsupported, by returning HV_EBADTRAP or | ||
15 | * HV_ENOTSUPPORTED, we assume that API groups with the | ||
16 | * PRE_API flag set are major 1 minor 0. | ||
17 | */ | ||
18 | struct api_info { | ||
19 | unsigned long group; | ||
20 | unsigned long major; | ||
21 | unsigned long minor; | ||
22 | unsigned int refcnt; | ||
23 | unsigned int flags; | ||
24 | #define FLAG_PRE_API 0x00000001 | ||
25 | }; | ||
26 | |||
27 | static struct api_info api_table[] = { | ||
28 | { .group = HV_GRP_SUN4V, .flags = FLAG_PRE_API }, | ||
29 | { .group = HV_GRP_CORE, .flags = FLAG_PRE_API }, | ||
30 | { .group = HV_GRP_INTR, }, | ||
31 | { .group = HV_GRP_SOFT_STATE, }, | ||
32 | { .group = HV_GRP_PCI, .flags = FLAG_PRE_API }, | ||
33 | { .group = HV_GRP_LDOM, }, | ||
34 | { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, | ||
35 | { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, | ||
36 | { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, | ||
37 | { .group = HV_GRP_FIRE_PERF, }, | ||
38 | { .group = HV_GRP_DIAG, .flags = FLAG_PRE_API }, | ||
39 | }; | ||
40 | |||
41 | static DEFINE_SPINLOCK(hvapi_lock); | ||
42 | |||
43 | static struct api_info *__get_info(unsigned long group) | ||
44 | { | ||
45 | int i; | ||
46 | |||
47 | for (i = 0; i < ARRAY_SIZE(api_table); i++) { | ||
48 | if (api_table[i].group == group) | ||
49 | return &api_table[i]; | ||
50 | } | ||
51 | return NULL; | ||
52 | } | ||
53 | |||
54 | static void __get_ref(struct api_info *p) | ||
55 | { | ||
56 | p->refcnt++; | ||
57 | } | ||
58 | |||
59 | static void __put_ref(struct api_info *p) | ||
60 | { | ||
61 | if (--p->refcnt == 0) { | ||
62 | unsigned long ignore; | ||
63 | |||
64 | sun4v_set_version(p->group, 0, 0, &ignore); | ||
65 | p->major = p->minor = 0; | ||
66 | } | ||
67 | } | ||
68 | |||
69 | /* Register a hypervisor API specification. It indicates the | ||
70 | * API group and desired major+minor. | ||
71 | * | ||
72 | * If an existing API registration exists '0' (success) will | ||
73 | * be returned if it is compatible with the one being registered. | ||
74 | * Otherwise a negative error code will be returned. | ||
75 | * | ||
76 | * Otherwise an attempt will be made to negotiate the requested | ||
77 | * API group/major/minor with the hypervisor, and errors returned | ||
78 | * if that does not succeed. | ||
79 | */ | ||
80 | int sun4v_hvapi_register(unsigned long group, unsigned long major, | ||
81 | unsigned long *minor) | ||
82 | { | ||
83 | struct api_info *p; | ||
84 | unsigned long flags; | ||
85 | int ret; | ||
86 | |||
87 | spin_lock_irqsave(&hvapi_lock, flags); | ||
88 | p = __get_info(group); | ||
89 | ret = -EINVAL; | ||
90 | if (p) { | ||
91 | if (p->refcnt) { | ||
92 | ret = -EINVAL; | ||
93 | if (p->major == major) { | ||
94 | *minor = p->minor; | ||
95 | ret = 0; | ||
96 | } | ||
97 | } else { | ||
98 | unsigned long actual_minor; | ||
99 | unsigned long hv_ret; | ||
100 | |||
101 | hv_ret = sun4v_set_version(group, major, *minor, | ||
102 | &actual_minor); | ||
103 | ret = -EINVAL; | ||
104 | if (hv_ret == HV_EOK) { | ||
105 | *minor = actual_minor; | ||
106 | p->major = major; | ||
107 | p->minor = actual_minor; | ||
108 | ret = 0; | ||
109 | } else if (hv_ret == HV_EBADTRAP || | ||
110 | HV_ENOTSUPPORTED) { | ||
111 | if (p->flags & FLAG_PRE_API) { | ||
112 | if (major == 1) { | ||
113 | p->major = 1; | ||
114 | p->minor = 0; | ||
115 | *minor = 0; | ||
116 | ret = 0; | ||
117 | } | ||
118 | } | ||
119 | } | ||
120 | } | ||
121 | |||
122 | if (ret == 0) | ||
123 | __get_ref(p); | ||
124 | } | ||
125 | spin_unlock_irqrestore(&hvapi_lock, flags); | ||
126 | |||
127 | return ret; | ||
128 | } | ||
129 | EXPORT_SYMBOL(sun4v_hvapi_register); | ||
130 | |||
131 | void sun4v_hvapi_unregister(unsigned long group) | ||
132 | { | ||
133 | struct api_info *p; | ||
134 | unsigned long flags; | ||
135 | |||
136 | spin_lock_irqsave(&hvapi_lock, flags); | ||
137 | p = __get_info(group); | ||
138 | if (p) | ||
139 | __put_ref(p); | ||
140 | spin_unlock_irqrestore(&hvapi_lock, flags); | ||
141 | } | ||
142 | EXPORT_SYMBOL(sun4v_hvapi_unregister); | ||
143 | |||
144 | int sun4v_hvapi_get(unsigned long group, | ||
145 | unsigned long *major, | ||
146 | unsigned long *minor) | ||
147 | { | ||
148 | struct api_info *p; | ||
149 | unsigned long flags; | ||
150 | int ret; | ||
151 | |||
152 | spin_lock_irqsave(&hvapi_lock, flags); | ||
153 | ret = -EINVAL; | ||
154 | p = __get_info(group); | ||
155 | if (p && p->refcnt) { | ||
156 | *major = p->major; | ||
157 | *minor = p->minor; | ||
158 | ret = 0; | ||
159 | } | ||
160 | spin_unlock_irqrestore(&hvapi_lock, flags); | ||
161 | |||
162 | return ret; | ||
163 | } | ||
164 | EXPORT_SYMBOL(sun4v_hvapi_get); | ||
165 | |||
166 | void __init sun4v_hvapi_init(void) | ||
167 | { | ||
168 | unsigned long group, major, minor; | ||
169 | |||
170 | group = HV_GRP_SUN4V; | ||
171 | major = 1; | ||
172 | minor = 0; | ||
173 | if (sun4v_hvapi_register(group, major, &minor)) | ||
174 | goto bad; | ||
175 | |||
176 | group = HV_GRP_CORE; | ||
177 | major = 1; | ||
178 | minor = 1; | ||
179 | if (sun4v_hvapi_register(group, major, &minor)) | ||
180 | goto bad; | ||
181 | |||
182 | return; | ||
183 | |||
184 | bad: | ||
185 | prom_printf("HVAPI: Cannot register API group " | ||
186 | "%lx with major(%u) minor(%u)\n", | ||
187 | group, major, minor); | ||
188 | prom_halt(); | ||
189 | } | ||
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c index 451028341c75..dea9c3c9ec5f 100644 --- a/arch/sparc64/kernel/setup.c +++ b/arch/sparc64/kernel/setup.c | |||
@@ -269,6 +269,7 @@ void __init per_cpu_patch(void) | |||
269 | 269 | ||
270 | void __init sun4v_patch(void) | 270 | void __init sun4v_patch(void) |
271 | { | 271 | { |
272 | extern void sun4v_hvapi_init(void); | ||
272 | struct sun4v_1insn_patch_entry *p1; | 273 | struct sun4v_1insn_patch_entry *p1; |
273 | struct sun4v_2insn_patch_entry *p2; | 274 | struct sun4v_2insn_patch_entry *p2; |
274 | 275 | ||
@@ -300,6 +301,8 @@ void __init sun4v_patch(void) | |||
300 | 301 | ||
301 | p2++; | 302 | p2++; |
302 | } | 303 | } |
304 | |||
305 | sun4v_hvapi_init(); | ||
303 | } | 306 | } |
304 | 307 | ||
305 | #ifdef CONFIG_SMP | 308 | #ifdef CONFIG_SMP |
diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index 02c0d52c9f76..7bfbad57879d 100644 --- a/drivers/parport/parport_pc.c +++ b/drivers/parport/parport_pc.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/ioport.h> | 51 | #include <linux/ioport.h> |
52 | #include <linux/kernel.h> | 52 | #include <linux/kernel.h> |
53 | #include <linux/slab.h> | 53 | #include <linux/slab.h> |
54 | #include <linux/dma-mapping.h> | ||
54 | #include <linux/pci.h> | 55 | #include <linux/pci.h> |
55 | #include <linux/pnp.h> | 56 | #include <linux/pnp.h> |
56 | #include <linux/platform_device.h> | 57 | #include <linux/platform_device.h> |
diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c index c3a6bd2e7950..96557e6dba60 100644 --- a/drivers/serial/sunhv.c +++ b/drivers/serial/sunhv.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* sunhv.c: Serial driver for SUN4V hypervisor console. | 1 | /* sunhv.c: Serial driver for SUN4V hypervisor console. |
2 | * | 2 | * |
3 | * Copyright (C) 2006 David S. Miller (davem@davemloft.net) | 3 | * Copyright (C) 2006, 2007 David S. Miller (davem@davemloft.net) |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/module.h> | 6 | #include <linux/module.h> |
@@ -35,57 +35,51 @@ | |||
35 | #define CON_BREAK ((long)-1) | 35 | #define CON_BREAK ((long)-1) |
36 | #define CON_HUP ((long)-2) | 36 | #define CON_HUP ((long)-2) |
37 | 37 | ||
38 | static inline long hypervisor_con_getchar(long *status) | 38 | #define IGNORE_BREAK 0x1 |
39 | { | 39 | #define IGNORE_ALL 0x2 |
40 | register unsigned long func asm("%o5"); | ||
41 | register unsigned long arg0 asm("%o0"); | ||
42 | register unsigned long arg1 asm("%o1"); | ||
43 | |||
44 | func = HV_FAST_CONS_GETCHAR; | ||
45 | arg0 = 0; | ||
46 | arg1 = 0; | ||
47 | __asm__ __volatile__("ta %6" | ||
48 | : "=&r" (func), "=&r" (arg0), "=&r" (arg1) | ||
49 | : "0" (func), "1" (arg0), "2" (arg1), | ||
50 | "i" (HV_FAST_TRAP)); | ||
51 | 40 | ||
52 | *status = arg0; | 41 | static char *con_write_page; |
42 | static char *con_read_page; | ||
53 | 43 | ||
54 | return (long) arg1; | 44 | static int hung_up = 0; |
55 | } | ||
56 | 45 | ||
57 | static inline long hypervisor_con_putchar(long ch) | 46 | static void transmit_chars_putchar(struct uart_port *port, struct circ_buf *xmit) |
58 | { | 47 | { |
59 | register unsigned long func asm("%o5"); | 48 | while (!uart_circ_empty(xmit)) { |
60 | register unsigned long arg0 asm("%o0"); | 49 | long status = sun4v_con_putchar(xmit->buf[xmit->tail]); |
61 | 50 | ||
62 | func = HV_FAST_CONS_PUTCHAR; | 51 | if (status != HV_EOK) |
63 | arg0 = ch; | 52 | break; |
64 | __asm__ __volatile__("ta %4" | ||
65 | : "=&r" (func), "=&r" (arg0) | ||
66 | : "0" (func), "1" (arg0), "i" (HV_FAST_TRAP)); | ||
67 | 53 | ||
68 | return (long) arg0; | 54 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
55 | port->icount.tx++; | ||
56 | } | ||
69 | } | 57 | } |
70 | 58 | ||
71 | #define IGNORE_BREAK 0x1 | 59 | static void transmit_chars_write(struct uart_port *port, struct circ_buf *xmit) |
72 | #define IGNORE_ALL 0x2 | 60 | { |
61 | while (!uart_circ_empty(xmit)) { | ||
62 | unsigned long ra = __pa(xmit->buf + xmit->tail); | ||
63 | unsigned long len, status, sent; | ||
73 | 64 | ||
74 | static int hung_up = 0; | 65 | len = CIRC_CNT_TO_END(xmit->head, xmit->tail, |
66 | UART_XMIT_SIZE); | ||
67 | status = sun4v_con_write(ra, len, &sent); | ||
68 | if (status != HV_EOK) | ||
69 | break; | ||
70 | xmit->tail = (xmit->tail + sent) & (UART_XMIT_SIZE - 1); | ||
71 | port->icount.tx += sent; | ||
72 | } | ||
73 | } | ||
75 | 74 | ||
76 | static struct tty_struct *receive_chars(struct uart_port *port) | 75 | static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty) |
77 | { | 76 | { |
78 | struct tty_struct *tty = NULL; | ||
79 | int saw_console_brk = 0; | 77 | int saw_console_brk = 0; |
80 | int limit = 10000; | 78 | int limit = 10000; |
81 | 79 | ||
82 | if (port->info != NULL) /* Unopened serial console */ | ||
83 | tty = port->info->tty; | ||
84 | |||
85 | while (limit-- > 0) { | 80 | while (limit-- > 0) { |
86 | long status; | 81 | long status; |
87 | long c = hypervisor_con_getchar(&status); | 82 | long c = sun4v_con_getchar(&status); |
88 | unsigned char flag; | ||
89 | 83 | ||
90 | if (status == HV_EWOULDBLOCK) | 84 | if (status == HV_EWOULDBLOCK) |
91 | break; | 85 | break; |
@@ -110,27 +104,90 @@ static struct tty_struct *receive_chars(struct uart_port *port) | |||
110 | continue; | 104 | continue; |
111 | } | 105 | } |
112 | 106 | ||
113 | flag = TTY_NORMAL; | ||
114 | port->icount.rx++; | 107 | port->icount.rx++; |
115 | if (c == CON_BREAK) { | ||
116 | port->icount.brk++; | ||
117 | if (uart_handle_break(port)) | ||
118 | continue; | ||
119 | flag = TTY_BREAK; | ||
120 | } | ||
121 | 108 | ||
122 | if (uart_handle_sysrq_char(port, c)) | 109 | if (uart_handle_sysrq_char(port, c)) |
123 | continue; | 110 | continue; |
124 | 111 | ||
125 | if ((port->ignore_status_mask & IGNORE_ALL) || | 112 | tty_insert_flip_char(tty, c, TTY_NORMAL); |
126 | ((port->ignore_status_mask & IGNORE_BREAK) && | 113 | } |
127 | (c == CON_BREAK))) | 114 | |
115 | return saw_console_brk; | ||
116 | } | ||
117 | |||
118 | static int receive_chars_read(struct uart_port *port, struct tty_struct *tty) | ||
119 | { | ||
120 | int saw_console_brk = 0; | ||
121 | int limit = 10000; | ||
122 | |||
123 | while (limit-- > 0) { | ||
124 | unsigned long ra = __pa(con_read_page); | ||
125 | unsigned long bytes_read, i; | ||
126 | long stat = sun4v_con_read(ra, PAGE_SIZE, &bytes_read); | ||
127 | |||
128 | if (stat != HV_EOK) { | ||
129 | bytes_read = 0; | ||
130 | |||
131 | if (stat == CON_BREAK) { | ||
132 | if (uart_handle_break(port)) | ||
133 | continue; | ||
134 | saw_console_brk = 1; | ||
135 | *con_read_page = 0; | ||
136 | bytes_read = 1; | ||
137 | } else if (stat == CON_HUP) { | ||
138 | hung_up = 1; | ||
139 | uart_handle_dcd_change(port, 0); | ||
140 | continue; | ||
141 | } else { | ||
142 | /* HV_EWOULDBLOCK, etc. */ | ||
143 | break; | ||
144 | } | ||
145 | } | ||
146 | |||
147 | if (hung_up) { | ||
148 | hung_up = 0; | ||
149 | uart_handle_dcd_change(port, 1); | ||
150 | } | ||
151 | |||
152 | for (i = 0; i < bytes_read; i++) | ||
153 | uart_handle_sysrq_char(port, con_read_page[i]); | ||
154 | |||
155 | if (tty == NULL) | ||
128 | continue; | 156 | continue; |
129 | 157 | ||
130 | tty_insert_flip_char(tty, c, flag); | 158 | port->icount.rx += bytes_read; |
159 | |||
160 | tty_insert_flip_string(tty, con_read_page, bytes_read); | ||
131 | } | 161 | } |
132 | 162 | ||
133 | if (saw_console_brk) | 163 | return saw_console_brk; |
164 | } | ||
165 | |||
166 | struct sunhv_ops { | ||
167 | void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit); | ||
168 | int (*receive_chars)(struct uart_port *port, struct tty_struct *tty); | ||
169 | }; | ||
170 | |||
171 | static struct sunhv_ops bychar_ops = { | ||
172 | .transmit_chars = transmit_chars_putchar, | ||
173 | .receive_chars = receive_chars_getchar, | ||
174 | }; | ||
175 | |||
176 | static struct sunhv_ops bywrite_ops = { | ||
177 | .transmit_chars = transmit_chars_write, | ||
178 | .receive_chars = receive_chars_read, | ||
179 | }; | ||
180 | |||
181 | static struct sunhv_ops *sunhv_ops = &bychar_ops; | ||
182 | |||
183 | static struct tty_struct *receive_chars(struct uart_port *port) | ||
184 | { | ||
185 | struct tty_struct *tty = NULL; | ||
186 | |||
187 | if (port->info != NULL) /* Unopened serial console */ | ||
188 | tty = port->info->tty; | ||
189 | |||
190 | if (sunhv_ops->receive_chars(port, tty)) | ||
134 | sun_do_break(); | 191 | sun_do_break(); |
135 | 192 | ||
136 | return tty; | 193 | return tty; |
@@ -147,15 +204,7 @@ static void transmit_chars(struct uart_port *port) | |||
147 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) | 204 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) |
148 | return; | 205 | return; |
149 | 206 | ||
150 | while (!uart_circ_empty(xmit)) { | 207 | sunhv_ops->transmit_chars(port, xmit); |
151 | long status = hypervisor_con_putchar(xmit->buf[xmit->tail]); | ||
152 | |||
153 | if (status != HV_EOK) | ||
154 | break; | ||
155 | |||
156 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | ||
157 | port->icount.tx++; | ||
158 | } | ||
159 | 208 | ||
160 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 209 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
161 | uart_write_wakeup(port); | 210 | uart_write_wakeup(port); |
@@ -212,7 +261,7 @@ static void sunhv_start_tx(struct uart_port *port) | |||
212 | struct circ_buf *xmit = &port->info->xmit; | 261 | struct circ_buf *xmit = &port->info->xmit; |
213 | 262 | ||
214 | while (!uart_circ_empty(xmit)) { | 263 | while (!uart_circ_empty(xmit)) { |
215 | long status = hypervisor_con_putchar(xmit->buf[xmit->tail]); | 264 | long status = sun4v_con_putchar(xmit->buf[xmit->tail]); |
216 | 265 | ||
217 | if (status != HV_EOK) | 266 | if (status != HV_EOK) |
218 | break; | 267 | break; |
@@ -231,9 +280,10 @@ static void sunhv_send_xchar(struct uart_port *port, char ch) | |||
231 | spin_lock_irqsave(&port->lock, flags); | 280 | spin_lock_irqsave(&port->lock, flags); |
232 | 281 | ||
233 | while (limit-- > 0) { | 282 | while (limit-- > 0) { |
234 | long status = hypervisor_con_putchar(ch); | 283 | long status = sun4v_con_putchar(ch); |
235 | if (status == HV_EOK) | 284 | if (status == HV_EOK) |
236 | break; | 285 | break; |
286 | udelay(1); | ||
237 | } | 287 | } |
238 | 288 | ||
239 | spin_unlock_irqrestore(&port->lock, flags); | 289 | spin_unlock_irqrestore(&port->lock, flags); |
@@ -254,15 +304,15 @@ static void sunhv_break_ctl(struct uart_port *port, int break_state) | |||
254 | { | 304 | { |
255 | if (break_state) { | 305 | if (break_state) { |
256 | unsigned long flags; | 306 | unsigned long flags; |
257 | int limit = 1000000; | 307 | int limit = 10000; |
258 | 308 | ||
259 | spin_lock_irqsave(&port->lock, flags); | 309 | spin_lock_irqsave(&port->lock, flags); |
260 | 310 | ||
261 | while (limit-- > 0) { | 311 | while (limit-- > 0) { |
262 | long status = hypervisor_con_putchar(CON_BREAK); | 312 | long status = sun4v_con_putchar(CON_BREAK); |
263 | if (status == HV_EOK) | 313 | if (status == HV_EOK) |
264 | break; | 314 | break; |
265 | udelay(2); | 315 | udelay(1); |
266 | } | 316 | } |
267 | 317 | ||
268 | spin_unlock_irqrestore(&port->lock, flags); | 318 | spin_unlock_irqrestore(&port->lock, flags); |
@@ -359,38 +409,99 @@ static struct uart_driver sunhv_reg = { | |||
359 | 409 | ||
360 | static struct uart_port *sunhv_port; | 410 | static struct uart_port *sunhv_port; |
361 | 411 | ||
362 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | 412 | /* Copy 's' into the con_write_page, decoding "\n" into |
413 | * "\r\n" along the way. We have to return two lengths | ||
414 | * because the caller needs to know how much to advance | ||
415 | * 's' and also how many bytes to output via con_write_page. | ||
416 | */ | ||
417 | static int fill_con_write_page(const char *s, unsigned int n, | ||
418 | unsigned long *page_bytes) | ||
419 | { | ||
420 | const char *orig_s = s; | ||
421 | char *p = con_write_page; | ||
422 | int left = PAGE_SIZE; | ||
423 | |||
424 | while (n--) { | ||
425 | if (*s == '\n') { | ||
426 | if (left < 2) | ||
427 | break; | ||
428 | *p++ = '\r'; | ||
429 | left--; | ||
430 | } else if (left < 1) | ||
431 | break; | ||
432 | *p++ = *s++; | ||
433 | left--; | ||
434 | } | ||
435 | *page_bytes = p - con_write_page; | ||
436 | return s - orig_s; | ||
437 | } | ||
438 | |||
439 | static void sunhv_console_write_paged(struct console *con, const char *s, unsigned n) | ||
363 | { | 440 | { |
441 | struct uart_port *port = sunhv_port; | ||
364 | unsigned long flags; | 442 | unsigned long flags; |
365 | int limit = 1000000; | ||
366 | 443 | ||
367 | spin_lock_irqsave(&port->lock, flags); | 444 | spin_lock_irqsave(&port->lock, flags); |
445 | while (n > 0) { | ||
446 | unsigned long ra = __pa(con_write_page); | ||
447 | unsigned long page_bytes; | ||
448 | unsigned int cpy = fill_con_write_page(s, n, | ||
449 | &page_bytes); | ||
450 | |||
451 | n -= cpy; | ||
452 | s += cpy; | ||
453 | while (page_bytes > 0) { | ||
454 | unsigned long written; | ||
455 | int limit = 1000000; | ||
456 | |||
457 | while (limit--) { | ||
458 | unsigned long stat; | ||
459 | |||
460 | stat = sun4v_con_write(ra, page_bytes, | ||
461 | &written); | ||
462 | if (stat == HV_EOK) | ||
463 | break; | ||
464 | udelay(1); | ||
465 | } | ||
466 | if (limit <= 0) | ||
467 | break; | ||
468 | page_bytes -= written; | ||
469 | ra += written; | ||
470 | } | ||
471 | } | ||
472 | spin_unlock_irqrestore(&port->lock, flags); | ||
473 | } | ||
474 | |||
475 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | ||
476 | { | ||
477 | int limit = 1000000; | ||
368 | 478 | ||
369 | while (limit-- > 0) { | 479 | while (limit-- > 0) { |
370 | long status = hypervisor_con_putchar(c); | 480 | long status = sun4v_con_putchar(c); |
371 | if (status == HV_EOK) | 481 | if (status == HV_EOK) |
372 | break; | 482 | break; |
373 | udelay(2); | 483 | udelay(1); |
374 | } | 484 | } |
375 | |||
376 | spin_unlock_irqrestore(&port->lock, flags); | ||
377 | } | 485 | } |
378 | 486 | ||
379 | static void sunhv_console_write(struct console *con, const char *s, unsigned n) | 487 | static void sunhv_console_write_bychar(struct console *con, const char *s, unsigned n) |
380 | { | 488 | { |
381 | struct uart_port *port = sunhv_port; | 489 | struct uart_port *port = sunhv_port; |
490 | unsigned long flags; | ||
382 | int i; | 491 | int i; |
383 | 492 | ||
493 | spin_lock_irqsave(&port->lock, flags); | ||
384 | for (i = 0; i < n; i++) { | 494 | for (i = 0; i < n; i++) { |
385 | if (*s == '\n') | 495 | if (*s == '\n') |
386 | sunhv_console_putchar(port, '\r'); | 496 | sunhv_console_putchar(port, '\r'); |
387 | sunhv_console_putchar(port, *s++); | 497 | sunhv_console_putchar(port, *s++); |
388 | } | 498 | } |
499 | spin_unlock_irqrestore(&port->lock, flags); | ||
389 | } | 500 | } |
390 | 501 | ||
391 | static struct console sunhv_console = { | 502 | static struct console sunhv_console = { |
392 | .name = "ttyHV", | 503 | .name = "ttyHV", |
393 | .write = sunhv_console_write, | 504 | .write = sunhv_console_write_bychar, |
394 | .device = uart_console_device, | 505 | .device = uart_console_device, |
395 | .flags = CON_PRINTBUFFER, | 506 | .flags = CON_PRINTBUFFER, |
396 | .index = -1, | 507 | .index = -1, |
@@ -410,6 +521,7 @@ static inline struct console *SUNHV_CONSOLE(void) | |||
410 | static int __devinit hv_probe(struct of_device *op, const struct of_device_id *match) | 521 | static int __devinit hv_probe(struct of_device *op, const struct of_device_id *match) |
411 | { | 522 | { |
412 | struct uart_port *port; | 523 | struct uart_port *port; |
524 | unsigned long minor; | ||
413 | int err; | 525 | int err; |
414 | 526 | ||
415 | if (op->irqs[0] == 0xffffffff) | 527 | if (op->irqs[0] == 0xffffffff) |
@@ -419,6 +531,22 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m | |||
419 | if (unlikely(!port)) | 531 | if (unlikely(!port)) |
420 | return -ENOMEM; | 532 | return -ENOMEM; |
421 | 533 | ||
534 | minor = 1; | ||
535 | if (sun4v_hvapi_register(HV_GRP_CORE, 1, &minor) == 0 && | ||
536 | minor >= 1) { | ||
537 | err = -ENOMEM; | ||
538 | con_write_page = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
539 | if (!con_write_page) | ||
540 | goto out_free_port; | ||
541 | |||
542 | con_read_page = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
543 | if (!con_read_page) | ||
544 | goto out_free_con_write_page; | ||
545 | |||
546 | sunhv_console.write = sunhv_console_write_paged; | ||
547 | sunhv_ops = &bywrite_ops; | ||
548 | } | ||
549 | |||
422 | sunhv_port = port; | 550 | sunhv_port = port; |
423 | 551 | ||
424 | port->line = 0; | 552 | port->line = 0; |
@@ -437,7 +565,7 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m | |||
437 | 565 | ||
438 | err = uart_register_driver(&sunhv_reg); | 566 | err = uart_register_driver(&sunhv_reg); |
439 | if (err) | 567 | if (err) |
440 | goto out_free_port; | 568 | goto out_free_con_read_page; |
441 | 569 | ||
442 | sunhv_reg.tty_driver->name_base = sunhv_reg.minor - 64; | 570 | sunhv_reg.tty_driver->name_base = sunhv_reg.minor - 64; |
443 | sunserial_current_minor += 1; | 571 | sunserial_current_minor += 1; |
@@ -463,6 +591,12 @@ out_unregister_driver: | |||
463 | sunserial_current_minor -= 1; | 591 | sunserial_current_minor -= 1; |
464 | uart_unregister_driver(&sunhv_reg); | 592 | uart_unregister_driver(&sunhv_reg); |
465 | 593 | ||
594 | out_free_con_read_page: | ||
595 | kfree(con_read_page); | ||
596 | |||
597 | out_free_con_write_page: | ||
598 | kfree(con_write_page); | ||
599 | |||
466 | out_free_port: | 600 | out_free_port: |
467 | kfree(port); | 601 | kfree(port); |
468 | sunhv_port = NULL; | 602 | sunhv_port = NULL; |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index c0a6dce800a3..225d6b2f82dd 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
@@ -484,7 +484,7 @@ static int spidev_probe(struct spi_device *spi) | |||
484 | * Reusing minors is fine so long as udev or mdev is working. | 484 | * Reusing minors is fine so long as udev or mdev is working. |
485 | */ | 485 | */ |
486 | mutex_lock(&device_list_lock); | 486 | mutex_lock(&device_list_lock); |
487 | minor = find_first_zero_bit(minors, ARRAY_SIZE(minors)); | 487 | minor = find_first_zero_bit(minors, N_SPI_MINORS); |
488 | if (minor < N_SPI_MINORS) { | 488 | if (minor < N_SPI_MINORS) { |
489 | spidev->dev.parent = &spi->dev; | 489 | spidev->dev.parent = &spi->dev; |
490 | spidev->dev.class = &spidev_class; | 490 | spidev->dev.class = &spidev_class; |
diff --git a/fs/afs/super.c b/fs/afs/super.c index 579af632c8e8..370cecc910db 100644 --- a/fs/afs/super.c +++ b/fs/afs/super.c | |||
@@ -47,7 +47,6 @@ struct file_system_type afs_fs_type = { | |||
47 | static const struct super_operations afs_super_ops = { | 47 | static const struct super_operations afs_super_ops = { |
48 | .statfs = afs_statfs, | 48 | .statfs = afs_statfs, |
49 | .alloc_inode = afs_alloc_inode, | 49 | .alloc_inode = afs_alloc_inode, |
50 | .drop_inode = generic_delete_inode, | ||
51 | .write_inode = afs_write_inode, | 50 | .write_inode = afs_write_inode, |
52 | .destroy_inode = afs_destroy_inode, | 51 | .destroy_inode = afs_destroy_inode, |
53 | .clear_inode = afs_clear_inode, | 52 | .clear_inode = afs_clear_inode, |
diff --git a/fs/afs/write.c b/fs/afs/write.c index 28f37516c126..a03b92a0fe1d 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c | |||
@@ -206,7 +206,6 @@ int afs_prepare_write(struct file *file, struct page *page, | |||
206 | _leave(" = %d [prep]", ret); | 206 | _leave(" = %d [prep]", ret); |
207 | return ret; | 207 | return ret; |
208 | } | 208 | } |
209 | SetPageUptodate(page); | ||
210 | } | 209 | } |
211 | 210 | ||
212 | try_again: | 211 | try_again: |
@@ -311,8 +310,8 @@ int afs_commit_write(struct file *file, struct page *page, | |||
311 | spin_unlock(&vnode->writeback_lock); | 310 | spin_unlock(&vnode->writeback_lock); |
312 | } | 311 | } |
313 | 312 | ||
313 | SetPageUptodate(page); | ||
314 | set_page_dirty(page); | 314 | set_page_dirty(page); |
315 | |||
316 | if (PageDirty(page)) | 315 | if (PageDirty(page)) |
317 | _debug("dirtied"); | 316 | _debug("dirtied"); |
318 | 317 | ||
diff --git a/include/asm-avr32/arch-at32ap/board.h b/include/asm-avr32/arch-at32ap/board.h index 1a7b07d436ff..9fd2e32f84b8 100644 --- a/include/asm-avr32/arch-at32ap/board.h +++ b/include/asm-avr32/arch-at32ap/board.h | |||
@@ -30,11 +30,9 @@ struct spi_board_info; | |||
30 | struct platform_device * | 30 | struct platform_device * |
31 | at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n); | 31 | at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n); |
32 | 32 | ||
33 | struct lcdc_platform_data { | 33 | struct atmel_lcdfb_info; |
34 | unsigned long fbmem_start; | ||
35 | unsigned long fbmem_size; | ||
36 | }; | ||
37 | struct platform_device * | 34 | struct platform_device * |
38 | at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data); | 35 | at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data, |
36 | unsigned long fbmem_start, unsigned long fbmem_len); | ||
39 | 37 | ||
40 | #endif /* __ASM_ARCH_BOARD_H */ | 38 | #endif /* __ASM_ARCH_BOARD_H */ |
diff --git a/include/asm-avr32/kdebug.h b/include/asm-avr32/kdebug.h index de419278fc39..7f54e2b15d13 100644 --- a/include/asm-avr32/kdebug.h +++ b/include/asm-avr32/kdebug.h | |||
@@ -5,13 +5,22 @@ | |||
5 | 5 | ||
6 | /* Grossly misnamed. */ | 6 | /* Grossly misnamed. */ |
7 | enum die_val { | 7 | enum die_val { |
8 | DIE_FAULT, | ||
9 | DIE_BREAKPOINT, | 8 | DIE_BREAKPOINT, |
10 | DIE_SSTEP, | 9 | DIE_SSTEP, |
11 | DIE_PAGE_FAULT, | ||
12 | }; | 10 | }; |
13 | 11 | ||
14 | int register_page_fault_notifier(struct notifier_block *nb); | 12 | /* |
15 | int unregister_page_fault_notifier(struct notifier_block *nb); | 13 | * These are only here because kprobes.c wants them to implement a |
14 | * blatant layering violation. Will hopefully go away soon once all | ||
15 | * architectures are updated. | ||
16 | */ | ||
17 | static inline int register_page_fault_notifier(struct notifier_block *nb) | ||
18 | { | ||
19 | return 0; | ||
20 | } | ||
21 | static inline int unregister_page_fault_notifier(struct notifier_block *nb) | ||
22 | { | ||
23 | return 0; | ||
24 | } | ||
16 | 25 | ||
17 | #endif /* __ASM_AVR32_KDEBUG_H */ | 26 | #endif /* __ASM_AVR32_KDEBUG_H */ |
diff --git a/include/asm-avr32/kprobes.h b/include/asm-avr32/kprobes.h index 09a5cbe2f896..190a6377c809 100644 --- a/include/asm-avr32/kprobes.h +++ b/include/asm-avr32/kprobes.h | |||
@@ -26,6 +26,7 @@ struct arch_specific_insn { | |||
26 | kprobe_opcode_t insn[MAX_INSN_SIZE]; | 26 | kprobe_opcode_t insn[MAX_INSN_SIZE]; |
27 | }; | 27 | }; |
28 | 28 | ||
29 | extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); | ||
29 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 30 | extern int kprobe_exceptions_notify(struct notifier_block *self, |
30 | unsigned long val, void *data); | 31 | unsigned long val, void *data); |
31 | 32 | ||
diff --git a/include/asm-avr32/unistd.h b/include/asm-avr32/unistd.h index 2418cce624cc..3b4e35b55c82 100644 --- a/include/asm-avr32/unistd.h +++ b/include/asm-avr32/unistd.h | |||
@@ -296,9 +296,12 @@ | |||
296 | #define __NR_shmctl 277 | 296 | #define __NR_shmctl 277 |
297 | 297 | ||
298 | #define __NR_utimensat 278 | 298 | #define __NR_utimensat 278 |
299 | #define __NR_signalfd 279 | ||
300 | #define __NR_timerfd 280 | ||
301 | #define __NR_eventfd 281 | ||
299 | 302 | ||
300 | #ifdef __KERNEL__ | 303 | #ifdef __KERNEL__ |
301 | #define NR_syscalls 279 | 304 | #define NR_syscalls 282 |
302 | 305 | ||
303 | 306 | ||
304 | #define __ARCH_WANT_IPC_PARSE_VERSION | 307 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/include/asm-ia64/kdebug.h b/include/asm-ia64/kdebug.h index ba211e011a1d..320cd8e754ea 100644 --- a/include/asm-ia64/kdebug.h +++ b/include/asm-ia64/kdebug.h | |||
@@ -28,14 +28,24 @@ | |||
28 | */ | 28 | */ |
29 | #include <linux/notifier.h> | 29 | #include <linux/notifier.h> |
30 | 30 | ||
31 | extern int register_page_fault_notifier(struct notifier_block *); | 31 | /* |
32 | extern int unregister_page_fault_notifier(struct notifier_block *); | 32 | * These are only here because kprobes.c wants them to implement a |
33 | * blatant layering violation. Will hopefully go away soon once all | ||
34 | * architectures are updated. | ||
35 | */ | ||
36 | static inline int register_page_fault_notifier(struct notifier_block *nb) | ||
37 | { | ||
38 | return 0; | ||
39 | } | ||
40 | static inline int unregister_page_fault_notifier(struct notifier_block *nb) | ||
41 | { | ||
42 | return 0; | ||
43 | } | ||
33 | 44 | ||
34 | enum die_val { | 45 | enum die_val { |
35 | DIE_BREAK = 1, | 46 | DIE_BREAK = 1, |
36 | DIE_FAULT, | 47 | DIE_FAULT, |
37 | DIE_OOPS, | 48 | DIE_OOPS, |
38 | DIE_PAGE_FAULT, | ||
39 | DIE_MACHINE_HALT, | 49 | DIE_MACHINE_HALT, |
40 | DIE_MACHINE_RESTART, | 50 | DIE_MACHINE_RESTART, |
41 | DIE_MCA_MONARCH_ENTER, | 51 | DIE_MCA_MONARCH_ENTER, |
diff --git a/include/asm-ia64/kprobes.h b/include/asm-ia64/kprobes.h index 2abc98b336f3..6382e52ec227 100644 --- a/include/asm-ia64/kprobes.h +++ b/include/asm-ia64/kprobes.h | |||
@@ -120,6 +120,7 @@ struct arch_specific_insn { | |||
120 | unsigned short slot; | 120 | unsigned short slot; |
121 | }; | 121 | }; |
122 | 122 | ||
123 | extern int kprobes_fault_handler(struct pt_regs *regs, int trapnr); | ||
123 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 124 | extern int kprobe_exceptions_notify(struct notifier_block *self, |
124 | unsigned long val, void *data); | 125 | unsigned long val, void *data); |
125 | 126 | ||
diff --git a/include/asm-ia64/unistd.h b/include/asm-ia64/unistd.h index f049bc40ca7d..d7781a2ddefe 100644 --- a/include/asm-ia64/unistd.h +++ b/include/asm-ia64/unistd.h | |||
@@ -296,11 +296,14 @@ | |||
296 | #define __NR_getcpu 1304 | 296 | #define __NR_getcpu 1304 |
297 | #define __NR_epoll_pwait 1305 | 297 | #define __NR_epoll_pwait 1305 |
298 | #define __NR_utimensat 1306 | 298 | #define __NR_utimensat 1306 |
299 | #define __NR_signalfd 1307 | ||
300 | #define __NR_timerfd 1308 | ||
301 | #define __NR_eventfd 1309 | ||
299 | 302 | ||
300 | #ifdef __KERNEL__ | 303 | #ifdef __KERNEL__ |
301 | 304 | ||
302 | 305 | ||
303 | #define NR_syscalls 283 /* length of syscall table */ | 306 | #define NR_syscalls 286 /* length of syscall table */ |
304 | 307 | ||
305 | #define __ARCH_WANT_SYS_RT_SIGACTION | 308 | #define __ARCH_WANT_SYS_RT_SIGACTION |
306 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | 309 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND |
diff --git a/include/asm-sparc64/hypervisor.h b/include/asm-sparc64/hypervisor.h index 612bf319753f..a5558c87556d 100644 --- a/include/asm-sparc64/hypervisor.h +++ b/include/asm-sparc64/hypervisor.h | |||
@@ -940,6 +940,54 @@ struct hv_fault_status { | |||
940 | */ | 940 | */ |
941 | #define HV_FAST_CONS_PUTCHAR 0x61 | 941 | #define HV_FAST_CONS_PUTCHAR 0x61 |
942 | 942 | ||
943 | /* con_read() | ||
944 | * TRAP: HV_FAST_TRAP | ||
945 | * FUNCTION: HV_FAST_CONS_READ | ||
946 | * ARG0: buffer real address | ||
947 | * ARG1: buffer size in bytes | ||
948 | * RET0: status | ||
949 | * RET1: bytes read or BREAK or HUP | ||
950 | * ERRORS: EWOULDBLOCK No character available. | ||
951 | * | ||
952 | * Reads characters into a buffer from the console device. If no | ||
953 | * character is available then an EWOULDBLOCK error is returned. | ||
954 | * If a character is available, then the returned status is EOK | ||
955 | * and the number of bytes read into the given buffer is provided | ||
956 | * in RET1. | ||
957 | * | ||
958 | * A virtual BREAK is represented by the 64-bit RET1 value -1. | ||
959 | * | ||
960 | * A virtual HUP signal is represented by the 64-bit RET1 value -2. | ||
961 | * | ||
962 | * If BREAK or HUP are indicated, no bytes were read into buffer. | ||
963 | */ | ||
964 | #define HV_FAST_CONS_READ 0x62 | ||
965 | |||
966 | /* con_write() | ||
967 | * TRAP: HV_FAST_TRAP | ||
968 | * FUNCTION: HV_FAST_CONS_WRITE | ||
969 | * ARG0: buffer real address | ||
970 | * ARG1: buffer size in bytes | ||
971 | * RET0: status | ||
972 | * RET1: bytes written | ||
973 | * ERRORS: EWOULDBLOCK Output buffer currently full, would block | ||
974 | * | ||
975 | * Send a characters in buffer to the console device. Breaks must be | ||
976 | * sent using con_putchar(). | ||
977 | */ | ||
978 | #define HV_FAST_CONS_WRITE 0x63 | ||
979 | |||
980 | #ifndef __ASSEMBLY__ | ||
981 | extern long sun4v_con_getchar(long *status); | ||
982 | extern long sun4v_con_putchar(long c); | ||
983 | extern long sun4v_con_read(unsigned long buffer, | ||
984 | unsigned long size, | ||
985 | unsigned long *bytes_read); | ||
986 | extern unsigned long sun4v_con_write(unsigned long buffer, | ||
987 | unsigned long size, | ||
988 | unsigned long *bytes_written); | ||
989 | #endif | ||
990 | |||
943 | /* Trap trace services. | 991 | /* Trap trace services. |
944 | * | 992 | * |
945 | * The hypervisor provides a trap tracing capability for privileged | 993 | * The hypervisor provides a trap tracing capability for privileged |
@@ -2121,8 +2169,41 @@ struct hv_mmu_statistics { | |||
2121 | #define HV_FAST_MMUSTAT_INFO 0x103 | 2169 | #define HV_FAST_MMUSTAT_INFO 0x103 |
2122 | 2170 | ||
2123 | /* Function numbers for HV_CORE_TRAP. */ | 2171 | /* Function numbers for HV_CORE_TRAP. */ |
2124 | #define HV_CORE_VER 0x00 | 2172 | #define HV_CORE_SET_VER 0x00 |
2125 | #define HV_CORE_PUTCHAR 0x01 | 2173 | #define HV_CORE_PUTCHAR 0x01 |
2126 | #define HV_CORE_EXIT 0x02 | 2174 | #define HV_CORE_EXIT 0x02 |
2175 | #define HV_CORE_GET_VER 0x03 | ||
2176 | |||
2177 | /* Hypervisor API groups for use with HV_CORE_SET_VER and | ||
2178 | * HV_CORE_GET_VER. | ||
2179 | */ | ||
2180 | #define HV_GRP_SUN4V 0x0000 | ||
2181 | #define HV_GRP_CORE 0x0001 | ||
2182 | #define HV_GRP_INTR 0x0002 | ||
2183 | #define HV_GRP_SOFT_STATE 0x0003 | ||
2184 | #define HV_GRP_PCI 0x0100 | ||
2185 | #define HV_GRP_LDOM 0x0101 | ||
2186 | #define HV_GRP_SVC_CHAN 0x0102 | ||
2187 | #define HV_GRP_NCS 0x0103 | ||
2188 | #define HV_GRP_NIAG_PERF 0x0200 | ||
2189 | #define HV_GRP_FIRE_PERF 0x0201 | ||
2190 | #define HV_GRP_DIAG 0x0300 | ||
2191 | |||
2192 | #ifndef __ASSEMBLY__ | ||
2193 | extern unsigned long sun4v_get_version(unsigned long group, | ||
2194 | unsigned long *major, | ||
2195 | unsigned long *minor); | ||
2196 | extern unsigned long sun4v_set_version(unsigned long group, | ||
2197 | unsigned long major, | ||
2198 | unsigned long minor, | ||
2199 | unsigned long *actual_minor); | ||
2200 | |||
2201 | extern int sun4v_hvapi_register(unsigned long group, unsigned long major, | ||
2202 | unsigned long *minor); | ||
2203 | extern void sun4v_hvapi_unregister(unsigned long group); | ||
2204 | extern int sun4v_hvapi_get(unsigned long group, | ||
2205 | unsigned long *major, | ||
2206 | unsigned long *minor); | ||
2207 | #endif | ||
2127 | 2208 | ||
2128 | #endif /* !(_SPARC64_HYPERVISOR_H) */ | 2209 | #endif /* !(_SPARC64_HYPERVISOR_H) */ |
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index fd6627e2d115..c6c1f4a120e3 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
@@ -88,7 +88,7 @@ static inline int kmalloc_index(int size) | |||
88 | */ | 88 | */ |
89 | WARN_ON_ONCE(size == 0); | 89 | WARN_ON_ONCE(size == 0); |
90 | 90 | ||
91 | if (size >= (1 << KMALLOC_SHIFT_HIGH)) | 91 | if (size > (1 << KMALLOC_SHIFT_HIGH)) |
92 | return -1; | 92 | return -1; |
93 | 93 | ||
94 | if (size > 64 && size <= 96) | 94 | if (size > 64 && size <= 96) |
diff --git a/kernel/power/main.c b/kernel/power/main.c index 40d56a31245e..b98b80ccf437 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -97,25 +97,26 @@ static int suspend_prepare(suspend_state_t state) | |||
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||
100 | if (pm_ops->prepare) { | ||
101 | if ((error = pm_ops->prepare(state))) | ||
102 | goto Thaw; | ||
103 | } | ||
104 | |||
105 | suspend_console(); | 100 | suspend_console(); |
106 | error = device_suspend(PMSG_SUSPEND); | 101 | error = device_suspend(PMSG_SUSPEND); |
107 | if (error) { | 102 | if (error) { |
108 | printk(KERN_ERR "Some devices failed to suspend\n"); | 103 | printk(KERN_ERR "Some devices failed to suspend\n"); |
109 | goto Resume_devices; | 104 | goto Resume_console; |
110 | } | 105 | } |
106 | if (pm_ops->prepare) { | ||
107 | if ((error = pm_ops->prepare(state))) | ||
108 | goto Resume_devices; | ||
109 | } | ||
110 | |||
111 | error = disable_nonboot_cpus(); | 111 | error = disable_nonboot_cpus(); |
112 | if (!error) | 112 | if (!error) |
113 | return 0; | 113 | return 0; |
114 | 114 | ||
115 | enable_nonboot_cpus(); | 115 | enable_nonboot_cpus(); |
116 | Resume_devices: | ||
117 | pm_finish(state); | 116 | pm_finish(state); |
117 | Resume_devices: | ||
118 | device_resume(); | 118 | device_resume(); |
119 | Resume_console: | ||
119 | resume_console(); | 120 | resume_console(); |
120 | Thaw: | 121 | Thaw: |
121 | thaw_processes(); | 122 | thaw_processes(); |
diff --git a/mm/filemap.c b/mm/filemap.c index 7b48b2ad00e7..edb1b0b5cc8d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -670,7 +670,8 @@ repeat: | |||
670 | page = find_lock_page(mapping, index); | 670 | page = find_lock_page(mapping, index); |
671 | if (!page) { | 671 | if (!page) { |
672 | if (!cached_page) { | 672 | if (!cached_page) { |
673 | cached_page = alloc_page(gfp_mask); | 673 | cached_page = |
674 | __page_cache_alloc(gfp_mask); | ||
674 | if (!cached_page) | 675 | if (!cached_page) |
675 | return NULL; | 676 | return NULL; |
676 | } | 677 | } |
@@ -2522,7 +2522,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, | |||
2522 | struct kmem_cache *s; | 2522 | struct kmem_cache *s; |
2523 | 2523 | ||
2524 | down_write(&slub_lock); | 2524 | down_write(&slub_lock); |
2525 | s = find_mergeable(size, align, flags, dtor, ctor); | 2525 | s = find_mergeable(size, align, flags, ctor, dtor); |
2526 | if (s) { | 2526 | if (s) { |
2527 | s->refcount++; | 2527 | s->refcount++; |
2528 | /* | 2528 | /* |