Whamcloud - gitweb
b=21122 fix a race between page fault and lock cancel.
[fs/lustre-release.git] / lustre / llite / llite_mmap.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 #ifndef AUTOCONF_INCLUDED
38 #include <linux/config.h>
39 #endif
40 #include <linux/kernel.h>
41 #include <linux/mm.h>
42 #include <linux/string.h>
43 #include <linux/stat.h>
44 #include <linux/errno.h>
45 #include <linux/smp_lock.h>
46 #include <linux/unistd.h>
47 #include <linux/version.h>
48 #include <asm/system.h>
49 #include <asm/uaccess.h>
50
51 #include <linux/fs.h>
52 #include <linux/stat.h>
53 #include <asm/uaccess.h>
54 #include <linux/mm.h>
55 #include <linux/pagemap.h>
56 #include <linux/smp_lock.h>
57
58 #define DEBUG_SUBSYSTEM S_LLITE
59
60 //#include <lustre_mdc.h>
61 #include <lustre_lite.h>
62 #include "llite_internal.h"
63 #include <linux/lustre_compat25.h>
64
65 #define VMA_DEBUG(vma, fmt, arg...)                                     \
66         CDEBUG(D_MMAP, "vma(%p) start(%ld) end(%ld) pgoff(%ld) inode(%p) "   \
67                "ino(%lu) iname(%s): " fmt, vma, vma->vm_start, vma->vm_end,  \
68                vma->vm_pgoff, vma->vm_file->f_dentry->d_inode,               \
69                vma->vm_file->f_dentry->d_inode->i_ino,                       \
70                vma->vm_file->f_dentry->d_iname, ## arg);                     \
71
72 static struct vm_operations_struct ll_file_vm_ops;
73
74 void policy_from_vma(ldlm_policy_data_t *policy,
75                             struct vm_area_struct *vma, unsigned long addr,
76                             size_t count)
77 {
78         policy->l_extent.start = ((addr - vma->vm_start) & CFS_PAGE_MASK) +
79                                  (vma->vm_pgoff << CFS_PAGE_SHIFT);
80         policy->l_extent.end = (policy->l_extent.start + count - 1) |
81                                ~CFS_PAGE_MASK;
82 }
83
84 struct vm_area_struct * our_vma(unsigned long addr, size_t count)
85 {
86         struct mm_struct *mm = current->mm;
87         struct vm_area_struct *vma, *ret = NULL;
88         ENTRY;
89
90         /* No MM (e.g. NFS)? No vmas too. */
91         if (!mm)
92                 RETURN(NULL);
93
94         spin_lock(&mm->page_table_lock);
95         for(vma = find_vma(mm, addr);
96             vma != NULL && vma->vm_start < (addr + count); vma = vma->vm_next) {
97                 if (vma->vm_ops && vma->vm_ops == &ll_file_vm_ops &&
98                     vma->vm_flags & VM_SHARED) {
99                         ret = vma;
100                         break;
101                 }
102         }
103         spin_unlock(&mm->page_table_lock);
104         RETURN(ret);
105 }
106
107 /**
108  * API independent part for page fault initialization.
109  * \param vma - virtual memory area addressed to page fault
110  * \param env - corespondent lu_env to processing
111  * \param nest - nested level
112  * \param index - page index corespondent to fault.
113  * \parm ra_flags - vma readahead flags.
114  *
115  * \return allocated and initialized env for fault operation.
116  * \retval EINVAL if env can't allocated
117  * \return other error codes from cl_io_init.
118  */
119 int ll_fault_io_init(struct vm_area_struct *vma, struct lu_env **env_ret,
120                      struct cl_env_nest *nest, pgoff_t index, unsigned long *ra_flags)
121 {
122         struct file       *file  = vma->vm_file;
123         struct inode      *inode = file->f_dentry->d_inode;
124         const unsigned long writable = VM_SHARED|VM_WRITE;
125         struct cl_io      *io;
126         struct cl_fault_io *fio;
127         struct lu_env     *env;
128         ENTRY;
129
130         if (ll_file_nolock(file))
131                 RETURN(-EOPNOTSUPP);
132
133         /*
134          * page fault can be called when lustre IO is
135          * already active for the current thread, e.g., when doing read/write
136          * against user level buffer mapped from Lustre buffer. To avoid
137          * stomping on existing context, optionally force an allocation of a new
138          * one.
139          */
140         env = cl_env_nested_get(nest);
141         if (IS_ERR(env)) {
142                 *env_ret = NULL;
143                  RETURN(-EINVAL);
144         }
145
146         *env_ret = env;
147
148         io = &ccc_env_info(env)->cti_io;
149         io->ci_obj = ll_i2info(inode)->lli_clob;
150         LASSERT(io->ci_obj != NULL);
151
152         fio = &io->u.ci_fault;
153         fio->ft_index      = index;
154         fio->ft_writable   = (vma->vm_flags&writable) == writable;
155         fio->ft_executable = vma->vm_flags&VM_EXEC;
156
157         /*
158          * disable VM_SEQ_READ and use VM_RAND_READ to make sure that
159          * the kernel will not read other pages not covered by ldlm in
160          * filemap_nopage. we do our readahead in ll_readpage.
161          */
162         *ra_flags = vma->vm_flags & (VM_RAND_READ|VM_SEQ_READ);
163         vma->vm_flags &= ~VM_SEQ_READ;
164         vma->vm_flags |= VM_RAND_READ;
165
166         CDEBUG(D_INFO, "vm_flags: %lx (%lu %d %d)\n", vma->vm_flags,
167                fio->ft_index, fio->ft_writable, fio->ft_executable);
168
169         if (cl_io_init(env, io, CIT_FAULT, io->ci_obj) == 0) {
170                 struct ccc_io *cio = ccc_env_io(env);
171                 struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
172
173                 LASSERT(cio->cui_cl.cis_io == io);
174
175                 /* mmap lock must be MANDATORY
176                  * it has to cache pages. */
177                 io->ci_lockreq = CILR_MANDATORY;
178
179                 cio->cui_fd  = fd;
180         }
181
182         return io->ci_result;
183 }
184
185 #ifndef HAVE_VM_OP_FAULT
186 /**
187  * Lustre implementation of a vm_operations_struct::nopage() method, called by
188  * VM to server page fault (both in kernel and user space).
189  *
190  * This function sets up CIT_FAULT cl_io that does the job.
191  *
192  * \param vma - is virtiual area struct related to page fault
193  * \param address - address when hit fault
194  * \param type - of fault
195  *
196  * \return allocated and filled _unlocked_ page for address
197  * \retval NOPAGE_SIGBUS if page not exist on this address
198  * \retval NOPAGE_OOM not have memory for allocate new page
199  */
200 struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
201                        int *type)
202 {
203         struct lu_env           *env;
204         struct cl_env_nest      nest;
205         struct cl_io            *io;
206         struct page             *page;
207         struct vvp_io           *vio;
208         unsigned long           ra_flags;
209         pgoff_t                 pg_offset;
210         int                     result;
211         ENTRY;
212
213         pg_offset = ((address - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
214         result = ll_fault_io_init(vma, &env,  &nest, pg_offset, &ra_flags);
215         if (env == NULL)
216                 return NOPAGE_SIGBUS;
217
218         io = &ccc_env_info(env)->cti_io;
219         if (result < 0)
220                 goto out_err;
221
222         vio = vvp_env_io(env);
223         vio->u.fault.ft_vma            = vma;
224         vio->u.fault.ft_vmpage         = NULL;
225         vio->u.fault.nopage.ft_address = address;
226         vio->u.fault.nopage.ft_type    = type;
227
228         result = cl_io_loop(env, io);
229
230         page = vio->u.fault.ft_vmpage;
231         if (page != NULL) {
232                 LASSERT(PageLocked(page));
233                 unlock_page(page);
234
235                 if (result != 0)
236                         page_cache_release(page);
237         }
238
239         LASSERT(ergo(result == 0, io->u.ci_fault.ft_page != NULL));
240 out_err:
241         if (result != 0)
242                 page = result == -ENOMEM ? NOPAGE_OOM : NOPAGE_SIGBUS;
243
244         vma->vm_flags &= ~VM_RAND_READ;
245         vma->vm_flags |= ra_flags;
246
247         cl_io_fini(env, io);
248         cl_env_nested_put(&nest, env);
249
250         RETURN(page);
251 }
252 #else
253 /**
254  * Lustre implementation of a vm_operations_struct::fault() method, called by
255  * VM to server page fault (both in kernel and user space).
256  *
257  * \param vma - is virtiual area struct related to page fault
258  * \param vmf - structure which describe type and address where hit fault
259  *
260  * \return allocated and filled _locked_ page for address
261  * \retval VM_FAULT_ERROR on general error
262  * \retval NOPAGE_OOM not have memory for allocate new page
263  */
264 int ll_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
265 {
266         struct lu_env           *env;
267         struct cl_io            *io;
268         struct vvp_io           *vio;
269         unsigned long            ra_flags;
270         struct cl_env_nest       nest;
271         int                      result;
272         int                      fault_ret = 0;
273         ENTRY;
274
275         result = ll_fault_io_init(vma, &env,  &nest, vmf->pgoff, &ra_flags);
276         if (env == NULL)
277                 RETURN(VM_FAULT_ERROR);
278
279         io = &ccc_env_info(env)->cti_io;
280         if (result < 0)
281                 goto out_err;
282
283         vio = vvp_env_io(env);
284         vio->u.fault.ft_vma       = vma;
285         vio->u.fault.ft_vmpage    = NULL;
286         vio->u.fault.fault.ft_vmf = vmf;
287
288         result = cl_io_loop(env, io);
289         if (unlikely(result != 0 && vio->u.fault.ft_vmpage != NULL)) {
290                 struct page *vmpage = vio->u.fault.ft_vmpage;
291
292                 LASSERT((vio->u.fault.fault.ft_flags & VM_FAULT_LOCKED) &&
293                         PageLocked(vmpage));
294                 unlock_page(vmpage);
295                 page_cache_release(vmpage);
296                 vmf->page = NULL;
297         }
298
299         fault_ret = vio->u.fault.fault.ft_flags;
300 out_err:
301         if (result != 0)
302                 fault_ret |= VM_FAULT_ERROR;
303
304         vma->vm_flags |= ra_flags;
305
306         cl_io_fini(env, io);
307         cl_env_nested_put(&nest, env);
308
309         RETURN(fault_ret);
310 }
311
312 #endif
313
314 /**
315  *  To avoid cancel the locks covering mmapped region for lock cache pressure,
316  *  we track the mapped vma count in ccc_object::cob_mmap_cnt.
317  */
318 static void ll_vm_open(struct vm_area_struct * vma)
319 {
320         struct inode *inode    = vma->vm_file->f_dentry->d_inode;
321         struct ccc_object *vob = cl_inode2ccc(inode);
322
323         ENTRY;
324         LASSERT(vma->vm_file);
325         LASSERT(cfs_atomic_read(&vob->cob_mmap_cnt) >= 0);
326         cfs_atomic_inc(&vob->cob_mmap_cnt);
327         EXIT;
328 }
329
330 /**
331  * Dual to ll_vm_open().
332  */
333 static void ll_vm_close(struct vm_area_struct *vma)
334 {
335         struct inode      *inode = vma->vm_file->f_dentry->d_inode;
336         struct ccc_object *vob   = cl_inode2ccc(inode);
337
338         ENTRY;
339         LASSERT(vma->vm_file);
340         cfs_atomic_dec(&vob->cob_mmap_cnt);
341         LASSERT(cfs_atomic_read(&vob->cob_mmap_cnt) >= 0);
342         EXIT;
343 }
344
345 #ifndef HAVE_VM_OP_FAULT
346 #ifndef HAVE_FILEMAP_POPULATE
347 static int (*filemap_populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
348 #endif
349 static int ll_populate(struct vm_area_struct *area, unsigned long address,
350                        unsigned long len, pgprot_t prot, unsigned long pgoff,
351                        int nonblock)
352 {
353         int rc = 0;
354         ENTRY;
355
356         /* always set nonblock as true to avoid page read ahead */
357         rc = filemap_populate(area, address, len, prot, pgoff, 1);
358         RETURN(rc);
359 }
360 #endif
361
362 /* return the user space pointer that maps to a file offset via a vma */
363 static inline unsigned long file_to_user(struct vm_area_struct *vma, __u64 byte)
364 {
365         return vma->vm_start + (byte - ((__u64)vma->vm_pgoff << CFS_PAGE_SHIFT));
366
367 }
368
369 /* XXX put nice comment here.  talk about __free_pte -> dirty pages and
370  * nopage's reference passing to the pte */
371 int ll_teardown_mmaps(struct address_space *mapping, __u64 first, __u64 last)
372 {
373         int rc = -ENOENT;
374         ENTRY;
375
376         LASSERTF(last > first, "last "LPU64" first "LPU64"\n", last, first);
377         if (mapping_mapped(mapping)) {
378                 rc = 0;
379                 unmap_mapping_range(mapping, first + CFS_PAGE_SIZE - 1,
380                                     last - first + 1, 0);
381         }
382
383         RETURN(rc);
384 }
385
386 static struct vm_operations_struct ll_file_vm_ops = {
387 #ifndef HAVE_VM_OP_FAULT
388         .nopage         = ll_nopage,
389         .populate       = ll_populate,
390
391 #else
392         .fault          = ll_fault,
393 #endif
394         .open           = ll_vm_open,
395         .close          = ll_vm_close,
396 };
397
398 int ll_file_mmap(struct file *file, struct vm_area_struct * vma)
399 {
400         struct inode *inode = file->f_dentry->d_inode;
401         int rc;
402         ENTRY;
403
404         if (ll_file_nolock(file))
405                 RETURN(-EOPNOTSUPP);
406
407         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_MAP, 1);
408         rc = generic_file_mmap(file, vma);
409         if (rc == 0) {
410 #if !defined(HAVE_FILEMAP_POPULATE) && !defined(HAVE_VM_OP_FAULT)
411                 if (!filemap_populate)
412                         filemap_populate = vma->vm_ops->populate;
413 #endif
414                 vma->vm_ops = &ll_file_vm_ops;
415                 vma->vm_ops->open(vma);
416                 /* update the inode's size and mtime */
417                 rc = cl_glimpse_size(inode);
418         }
419
420         RETURN(rc);
421 }