diff options
-rw-r--r-- | include/linux/hugetlb.h | 8 | ||||
-rw-r--r-- | include/linux/shm.h | 5 | ||||
-rw-r--r-- | ipc/shm.c | 32 |
3 files changed, 38 insertions, 7 deletions
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index a60995afe334..3f3e7a648da3 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #ifdef CONFIG_HUGETLB_PAGE | 4 | #ifdef CONFIG_HUGETLB_PAGE |
5 | 5 | ||
6 | #include <linux/mempolicy.h> | 6 | #include <linux/mempolicy.h> |
7 | #include <linux/shm.h> | ||
7 | #include <asm/tlbflush.h> | 8 | #include <asm/tlbflush.h> |
8 | 9 | ||
9 | struct ctl_table; | 10 | struct ctl_table; |
@@ -168,7 +169,12 @@ void hugetlb_put_quota(struct address_space *mapping); | |||
168 | 169 | ||
169 | static inline int is_file_hugepages(struct file *file) | 170 | static inline int is_file_hugepages(struct file *file) |
170 | { | 171 | { |
171 | return file->f_op == &hugetlbfs_file_operations; | 172 | if (file->f_op == &hugetlbfs_file_operations) |
173 | return 1; | ||
174 | if (is_file_shm_hugepages(file)) | ||
175 | return 1; | ||
176 | |||
177 | return 0; | ||
172 | } | 178 | } |
173 | 179 | ||
174 | static inline void set_file_hugepages(struct file *file) | 180 | static inline void set_file_hugepages(struct file *file) |
diff --git a/include/linux/shm.h b/include/linux/shm.h index a2c896ad0bef..ad2e3af65997 100644 --- a/include/linux/shm.h +++ b/include/linux/shm.h | |||
@@ -96,12 +96,17 @@ struct shmid_kernel /* private to the kernel */ | |||
96 | 96 | ||
97 | #ifdef CONFIG_SYSVIPC | 97 | #ifdef CONFIG_SYSVIPC |
98 | long do_shmat(int shmid, char __user *shmaddr, int shmflg, unsigned long *addr); | 98 | long do_shmat(int shmid, char __user *shmaddr, int shmflg, unsigned long *addr); |
99 | extern int is_file_shm_hugepages(struct file *file); | ||
99 | #else | 100 | #else |
100 | static inline long do_shmat(int shmid, char __user *shmaddr, | 101 | static inline long do_shmat(int shmid, char __user *shmaddr, |
101 | int shmflg, unsigned long *addr) | 102 | int shmflg, unsigned long *addr) |
102 | { | 103 | { |
103 | return -ENOSYS; | 104 | return -ENOSYS; |
104 | } | 105 | } |
106 | static inline int is_file_shm_hugepages(struct file *file) | ||
107 | { | ||
108 | return 0; | ||
109 | } | ||
105 | #endif | 110 | #endif |
106 | 111 | ||
107 | #endif /* __KERNEL__ */ | 112 | #endif /* __KERNEL__ */ |
@@ -285,21 +285,41 @@ static int shm_release(struct inode *ino, struct file *file) | |||
285 | return 0; | 285 | return 0; |
286 | } | 286 | } |
287 | 287 | ||
288 | #ifndef CONFIG_MMU | 288 | static int shm_fsync(struct file *file, struct dentry *dentry, int datasync) |
289 | { | ||
290 | int (*fsync) (struct file *, struct dentry *, int datasync); | ||
291 | struct shm_file_data *sfd = shm_file_data(file); | ||
292 | int ret = -EINVAL; | ||
293 | |||
294 | fsync = sfd->file->f_op->fsync; | ||
295 | if (fsync) | ||
296 | ret = fsync(sfd->file, sfd->file->f_path.dentry, datasync); | ||
297 | return ret; | ||
298 | } | ||
299 | |||
289 | static unsigned long shm_get_unmapped_area(struct file *file, | 300 | static unsigned long shm_get_unmapped_area(struct file *file, |
290 | unsigned long addr, unsigned long len, unsigned long pgoff, | 301 | unsigned long addr, unsigned long len, unsigned long pgoff, |
291 | unsigned long flags) | 302 | unsigned long flags) |
292 | { | 303 | { |
293 | struct shm_file_data *sfd = shm_file_data(file); | 304 | struct shm_file_data *sfd = shm_file_data(file); |
294 | return sfd->file->f_op->get_unmapped_area(sfd->file, addr, len, pgoff, | 305 | return get_unmapped_area(sfd->file, addr, len, pgoff, flags); |
295 | flags); | 306 | } |
307 | |||
308 | int is_file_shm_hugepages(struct file *file) | ||
309 | { | ||
310 | int ret = 0; | ||
311 | |||
312 | if (file->f_op == &shm_file_operations) { | ||
313 | struct shm_file_data *sfd; | ||
314 | sfd = shm_file_data(file); | ||
315 | ret = is_file_hugepages(sfd->file); | ||
316 | } | ||
317 | return ret; | ||
296 | } | 318 | } |
297 | #else | ||
298 | #define shm_get_unmapped_area NULL | ||
299 | #endif | ||
300 | 319 | ||
301 | static const struct file_operations shm_file_operations = { | 320 | static const struct file_operations shm_file_operations = { |
302 | .mmap = shm_mmap, | 321 | .mmap = shm_mmap, |
322 | .fsync = shm_fsync, | ||
303 | .release = shm_release, | 323 | .release = shm_release, |
304 | .get_unmapped_area = shm_get_unmapped_area, | 324 | .get_unmapped_area = shm_get_unmapped_area, |
305 | }; | 325 | }; |