diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-02 15:48:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-02 15:48:07 -0400 |
commit | 23344cb341902f4e3431d8137dca93d6e186d054 (patch) | |
tree | 2a0e443ade173b80cb0df261f4b2d66f79b9270e /arch | |
parent | bacd3add087770333bdce65cd3dd25e3b2cd67ac (diff) | |
parent | 289eee6fa78e999208120c856ef3ae5a817fd59c (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6:
[SPARC]: Wire up sys_sync_file_range() into syscall tables.
[SPARC]: Wire up sys_splice() into the syscall tables.
[SPARC64]: Update defconfig.
[SPARC64]: Align address in huge_pte_alloc().
[SPARC64]: Document the instruction checks we do in do_sparc64_fault().
[SPARC64]: Make tsb_sync() mm comparison more precise.
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sparc/kernel/systbls.S | 4 | ||||
-rw-r--r-- | arch/sparc64/defconfig | 14 | ||||
-rw-r--r-- | arch/sparc64/kernel/smp.c | 9 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys32.S | 2 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 8 | ||||
-rw-r--r-- | arch/sparc64/kernel/systbls.S | 8 | ||||
-rw-r--r-- | arch/sparc64/mm/fault.c | 6 | ||||
-rw-r--r-- | arch/sparc64/mm/hugetlbpage.c | 7 |
8 files changed, 46 insertions, 12 deletions
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index 768de64b371f..fbbec5e761c6 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
@@ -64,13 +64,13 @@ sys_call_table: | |||
64 | /*215*/ .long sys_ipc, sys_sigreturn, sys_clone, sys_ioprio_get, sys_adjtimex | 64 | /*215*/ .long sys_ipc, sys_sigreturn, sys_clone, sys_ioprio_get, sys_adjtimex |
65 | /*220*/ .long sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid | 65 | /*220*/ .long sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid |
66 | /*225*/ .long sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 | 66 | /*225*/ .long sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 |
67 | /*230*/ .long sys_select, sys_time, sys_nis_syscall, sys_stime, sys_statfs64 | 67 | /*230*/ .long sys_select, sys_time, sys_splice, sys_stime, sys_statfs64 |
68 | /* "We are the Knights of the Forest of Ni!!" */ | 68 | /* "We are the Knights of the Forest of Ni!!" */ |
69 | /*235*/ .long sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall | 69 | /*235*/ .long sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall |
70 | /*240*/ .long sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler | 70 | /*240*/ .long sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler |
71 | /*245*/ .long sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep | 71 | /*245*/ .long sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep |
72 | /*250*/ .long sparc_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl | 72 | /*250*/ .long sparc_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl |
73 | /*255*/ .long sys_nis_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep | 73 | /*255*/ .long sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep |
74 | /*260*/ .long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun | 74 | /*260*/ .long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun |
75 | /*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_io_setup, sys_io_destroy | 75 | /*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_io_setup, sys_io_destroy |
76 | /*270*/ .long sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink | 76 | /*270*/ .long sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink |
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index 900fb0b940d8..30389085a359 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.16 | 3 | # Linux kernel version: 2.6.16 |
4 | # Sun Mar 26 14:58:11 2006 | 4 | # Fri Mar 31 01:40:57 2006 |
5 | # | 5 | # |
6 | CONFIG_SPARC=y | 6 | CONFIG_SPARC=y |
7 | CONFIG_SPARC64=y | 7 | CONFIG_SPARC64=y |
@@ -180,6 +180,7 @@ CONFIG_SYN_COOKIES=y | |||
180 | CONFIG_INET_AH=y | 180 | CONFIG_INET_AH=y |
181 | CONFIG_INET_ESP=y | 181 | CONFIG_INET_ESP=y |
182 | CONFIG_INET_IPCOMP=y | 182 | CONFIG_INET_IPCOMP=y |
183 | CONFIG_INET_XFRM_TUNNEL=y | ||
183 | CONFIG_INET_TUNNEL=y | 184 | CONFIG_INET_TUNNEL=y |
184 | CONFIG_INET_DIAG=y | 185 | CONFIG_INET_DIAG=y |
185 | CONFIG_INET_TCP_DIAG=y | 186 | CONFIG_INET_TCP_DIAG=y |
@@ -203,6 +204,7 @@ CONFIG_IPV6_ROUTE_INFO=y | |||
203 | CONFIG_INET6_AH=m | 204 | CONFIG_INET6_AH=m |
204 | CONFIG_INET6_ESP=m | 205 | CONFIG_INET6_ESP=m |
205 | CONFIG_INET6_IPCOMP=m | 206 | CONFIG_INET6_IPCOMP=m |
207 | CONFIG_INET6_XFRM_TUNNEL=m | ||
206 | CONFIG_INET6_TUNNEL=m | 208 | CONFIG_INET6_TUNNEL=m |
207 | CONFIG_IPV6_TUNNEL=m | 209 | CONFIG_IPV6_TUNNEL=m |
208 | # CONFIG_NETFILTER is not set | 210 | # CONFIG_NETFILTER is not set |
@@ -308,7 +310,6 @@ CONFIG_BLK_DEV_NBD=m | |||
308 | # CONFIG_BLK_DEV_SX8 is not set | 310 | # CONFIG_BLK_DEV_SX8 is not set |
309 | CONFIG_BLK_DEV_UB=m | 311 | CONFIG_BLK_DEV_UB=m |
310 | # CONFIG_BLK_DEV_RAM is not set | 312 | # CONFIG_BLK_DEV_RAM is not set |
311 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
312 | # CONFIG_BLK_DEV_INITRD is not set | 313 | # CONFIG_BLK_DEV_INITRD is not set |
313 | CONFIG_CDROM_PKTCDVD=m | 314 | CONFIG_CDROM_PKTCDVD=m |
314 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | 315 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 |
@@ -449,6 +450,7 @@ CONFIG_MD_RAID0=m | |||
449 | CONFIG_MD_RAID1=m | 450 | CONFIG_MD_RAID1=m |
450 | CONFIG_MD_RAID10=m | 451 | CONFIG_MD_RAID10=m |
451 | CONFIG_MD_RAID5=m | 452 | CONFIG_MD_RAID5=m |
453 | # CONFIG_MD_RAID5_RESHAPE is not set | ||
452 | CONFIG_MD_RAID6=m | 454 | CONFIG_MD_RAID6=m |
453 | CONFIG_MD_MULTIPATH=m | 455 | CONFIG_MD_MULTIPATH=m |
454 | # CONFIG_MD_FAULTY is not set | 456 | # CONFIG_MD_FAULTY is not set |
@@ -741,9 +743,7 @@ CONFIG_I2C_ALGOBIT=y | |||
741 | # CONFIG_SENSORS_PCF8574 is not set | 743 | # CONFIG_SENSORS_PCF8574 is not set |
742 | # CONFIG_SENSORS_PCA9539 is not set | 744 | # CONFIG_SENSORS_PCA9539 is not set |
743 | # CONFIG_SENSORS_PCF8591 is not set | 745 | # CONFIG_SENSORS_PCF8591 is not set |
744 | # CONFIG_SENSORS_RTC8564 is not set | ||
745 | # CONFIG_SENSORS_MAX6875 is not set | 746 | # CONFIG_SENSORS_MAX6875 is not set |
746 | # CONFIG_RTC_X1205_I2C is not set | ||
747 | # CONFIG_I2C_DEBUG_CORE is not set | 747 | # CONFIG_I2C_DEBUG_CORE is not set |
748 | # CONFIG_I2C_DEBUG_ALGO is not set | 748 | # CONFIG_I2C_DEBUG_ALGO is not set |
749 | # CONFIG_I2C_DEBUG_BUS is not set | 749 | # CONFIG_I2C_DEBUG_BUS is not set |
@@ -826,6 +826,7 @@ CONFIG_FB_CFB_FILLRECT=y | |||
826 | CONFIG_FB_CFB_COPYAREA=y | 826 | CONFIG_FB_CFB_COPYAREA=y |
827 | CONFIG_FB_CFB_IMAGEBLIT=y | 827 | CONFIG_FB_CFB_IMAGEBLIT=y |
828 | # CONFIG_FB_MACMODES is not set | 828 | # CONFIG_FB_MACMODES is not set |
829 | # CONFIG_FB_FIRMWARE_EDID is not set | ||
829 | CONFIG_FB_MODE_HELPERS=y | 830 | CONFIG_FB_MODE_HELPERS=y |
830 | CONFIG_FB_TILEBLITTING=y | 831 | CONFIG_FB_TILEBLITTING=y |
831 | # CONFIG_FB_CIRRUS is not set | 832 | # CONFIG_FB_CIRRUS is not set |
@@ -1117,6 +1118,11 @@ CONFIG_USB_HIDDEV=y | |||
1117 | # | 1118 | # |
1118 | 1119 | ||
1119 | # | 1120 | # |
1121 | # Real Time Clock | ||
1122 | # | ||
1123 | # CONFIG_RTC_CLASS is not set | ||
1124 | |||
1125 | # | ||
1120 | # Misc Linux/SPARC drivers | 1126 | # Misc Linux/SPARC drivers |
1121 | # | 1127 | # |
1122 | CONFIG_SUN_OPENPROMIO=m | 1128 | CONFIG_SUN_OPENPROMIO=m |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 7dc28a484268..8175a6968c6b 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -830,9 +830,16 @@ void smp_call_function_client(int irq, struct pt_regs *regs) | |||
830 | 830 | ||
831 | static void tsb_sync(void *info) | 831 | static void tsb_sync(void *info) |
832 | { | 832 | { |
833 | struct trap_per_cpu *tp = &trap_block[raw_smp_processor_id()]; | ||
833 | struct mm_struct *mm = info; | 834 | struct mm_struct *mm = info; |
834 | 835 | ||
835 | if (current->active_mm == mm) | 836 | /* It is not valid to test "currrent->active_mm == mm" here. |
837 | * | ||
838 | * The value of "current" is not changed atomically with | ||
839 | * switch_mm(). But that's OK, we just need to check the | ||
840 | * current cpu's trap block PGD physical address. | ||
841 | */ | ||
842 | if (tp->pgd_paddr == __pa(mm->pgd)) | ||
836 | tsb_context_switch(mm); | 843 | tsb_context_switch(mm); |
837 | } | 844 | } |
838 | 845 | ||
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index c4a1cef4b1e5..86dd5cb81e09 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
@@ -136,6 +136,8 @@ SIGN1(sys32_getpeername, sys_getpeername, %o0) | |||
136 | SIGN1(sys32_getsockname, sys_getsockname, %o0) | 136 | SIGN1(sys32_getsockname, sys_getsockname, %o0) |
137 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) | 137 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) |
138 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) | 138 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) |
139 | SIGN2(sys32_splice, sys_splice, %o0, %o1) | ||
140 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) | ||
139 | 141 | ||
140 | .globl sys32_mmap2 | 142 | .globl sys32_mmap2 |
141 | sys32_mmap2: | 143 | sys32_mmap2: |
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 2e906bad56fa..31030bf00f1a 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -1069,3 +1069,11 @@ long sys32_lookup_dcookie(unsigned long cookie_high, | |||
1069 | return sys_lookup_dcookie((cookie_high << 32) | cookie_low, | 1069 | return sys_lookup_dcookie((cookie_high << 32) | cookie_low, |
1070 | buf, len); | 1070 | buf, len); |
1071 | } | 1071 | } |
1072 | |||
1073 | long compat_sync_file_range(int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, int flags) | ||
1074 | { | ||
1075 | return sys_sync_file_range(fd, | ||
1076 | (off_high << 32) | off_low, | ||
1077 | (nb_high << 32) | nb_low, | ||
1078 | flags); | ||
1079 | } | ||
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index 3b250f2318fd..857b82c82875 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -66,12 +66,12 @@ sys_call_table32: | |||
66 | .word sys32_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex | 66 | .word sys32_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex |
67 | /*220*/ .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid | 67 | /*220*/ .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid |
68 | .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 | 68 | .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 |
69 | /*230*/ .word sys32_select, compat_sys_time, sys_nis_syscall, compat_sys_stime, compat_sys_statfs64 | 69 | /*230*/ .word sys32_select, compat_sys_time, sys32_splice, compat_sys_stime, compat_sys_statfs64 |
70 | .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall | 70 | .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall |
71 | /*240*/ .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler | 71 | /*240*/ .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler |
72 | .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep | 72 | .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep |
73 | /*250*/ .word sys32_mremap, sys32_sysctl, sys32_getsid, sys_fdatasync, sys32_nfsservctl | 73 | /*250*/ .word sys32_mremap, sys32_sysctl, sys32_getsid, sys_fdatasync, sys32_nfsservctl |
74 | .word sys_ni_syscall, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep | 74 | .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep |
75 | /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun | 75 | /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun |
76 | .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy | 76 | .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy |
77 | /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink | 77 | /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink |
@@ -135,12 +135,12 @@ sys_call_table: | |||
135 | .word sys_ipc, sys_nis_syscall, sys_clone, sys_ioprio_get, sys_adjtimex | 135 | .word sys_ipc, sys_nis_syscall, sys_clone, sys_ioprio_get, sys_adjtimex |
136 | /*220*/ .word sys_nis_syscall, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid | 136 | /*220*/ .word sys_nis_syscall, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid |
137 | .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid | 137 | .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid |
138 | /*230*/ .word sys_select, sys_nis_syscall, sys_nis_syscall, sys_stime, sys_statfs64 | 138 | /*230*/ .word sys_select, sys_nis_syscall, sys_splice, sys_stime, sys_statfs64 |
139 | .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall | 139 | .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall |
140 | /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler | 140 | /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler |
141 | .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep | 141 | .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep |
142 | /*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl | 142 | /*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl |
143 | .word sys_ni_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep | 143 | .word sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep |
144 | /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun | 144 | /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun |
145 | .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy | 145 | .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy |
146 | /*270*/ .word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink | 146 | /*270*/ .word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink |
diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index 0db2f7d9fab5..6e002aacb961 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c | |||
@@ -327,8 +327,12 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | |||
327 | insn = get_fault_insn(regs, 0); | 327 | insn = get_fault_insn(regs, 0); |
328 | if (!insn) | 328 | if (!insn) |
329 | goto continue_fault; | 329 | goto continue_fault; |
330 | /* All loads, stores and atomics have bits 30 and 31 both set | ||
331 | * in the instruction. Bit 21 is set in all stores, but we | ||
332 | * have to avoid prefetches which also have bit 21 set. | ||
333 | */ | ||
330 | if ((insn & 0xc0200000) == 0xc0200000 && | 334 | if ((insn & 0xc0200000) == 0xc0200000 && |
331 | (insn & 0x1780000) != 0x1680000) { | 335 | (insn & 0x01780000) != 0x01680000) { |
332 | /* Don't bother updating thread struct value, | 336 | /* Don't bother updating thread struct value, |
333 | * because update_mmu_cache only cares which tlb | 337 | * because update_mmu_cache only cares which tlb |
334 | * the access came from. | 338 | * the access came from. |
diff --git a/arch/sparc64/mm/hugetlbpage.c b/arch/sparc64/mm/hugetlbpage.c index 074620d413d4..fbbbebbad8a4 100644 --- a/arch/sparc64/mm/hugetlbpage.c +++ b/arch/sparc64/mm/hugetlbpage.c | |||
@@ -198,6 +198,13 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) | |||
198 | pmd_t *pmd; | 198 | pmd_t *pmd; |
199 | pte_t *pte = NULL; | 199 | pte_t *pte = NULL; |
200 | 200 | ||
201 | /* We must align the address, because our caller will run | ||
202 | * set_huge_pte_at() on whatever we return, which writes out | ||
203 | * all of the sub-ptes for the hugepage range. So we have | ||
204 | * to give it the first such sub-pte. | ||
205 | */ | ||
206 | addr &= HPAGE_MASK; | ||
207 | |||
201 | pgd = pgd_offset(mm, addr); | 208 | pgd = pgd_offset(mm, addr); |
202 | pud = pud_alloc(mm, pgd, addr); | 209 | pud = pud_alloc(mm, pgd, addr); |
203 | if (pud) { | 210 | if (pud) { |