On Tue, Dec 19, 2017 at 08:58:23AM -0800, Matthew Wilcox wrote: > From: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> > > The __cond_lock macro expects the function to return 'true' if the lock > was acquired and 'false' if it wasn't. We have another common calling > convention in the kernel, which is returning 0 on success and an errno > on failure. It's hard to use the existing __cond_lock macro for those > kinds of functions, so introduce __cond_lock_err() and convert the > two existing users. This is much cleaner! One quick issue below. > Signed-off-by: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> > --- > include/linux/compiler_types.h | 2 ++ > include/linux/mm.h | 9 ++------- > mm/memory.c | 9 ++------- > 3 files changed, 6 insertions(+), 14 deletions(-) > > diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h > index 6b79a9bba9a7..ff3c41c78efa 100644 > --- a/include/linux/compiler_types.h > +++ b/include/linux/compiler_types.h > @@ -16,6 +16,7 @@ > # define __acquire(x) __context__(x,1) > # define __release(x) __context__(x,-1) > # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) > +# define __cond_lock_err(x,c) ((c) ? 1 : ({ __acquire(x); 0; })) ^ I think we actually want this to return c here ^ The old code saved off the actual return value from __follow_pte_pmd() (say, -EINVAL) in 'res', and that was what was returned on error from both follow_pte_pmd() and follow_pte(). The value of 1 returned by __cond_lock() was just discarded (after we cast it to void for some reason). With this new code we actually return the value from __cond_lock_err(), which means that instead of returning -EINVAL, we'll return 1 on error. > # define __percpu __attribute__((noderef, address_space(3))) > # define __rcu __attribute__((noderef, address_space(4))) > # define __private __attribute__((noderef)) > @@ -42,6 +43,7 @@ extern void __chk_io_ptr(const volatile void __iomem *); > # define __acquire(x) (void)0 > # define __release(x) (void)0 > # define __cond_lock(x,c) (c) > +# define __cond_lock_err(x,c) (c) > # define __percpu > # define __rcu > # define __private > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 94a9d2149bd6..2ccdc980296b 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1328,13 +1328,8 @@ static inline int follow_pte_pmd(struct mm_struct *mm, unsigned long address, > unsigned long *start, unsigned long *end, > pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp) > { > - int res; > - > - /* (void) is needed to make gcc happy */ > - (void) __cond_lock(*ptlp, > - !(res = __follow_pte_pmd(mm, address, start, end, > - ptepp, pmdpp, ptlp))); > - return res; > + return __cond_lock_err(*ptlp, __follow_pte_pmd(mm, address, start, end, > + ptepp, pmdpp, ptlp)); > } > > static inline void unmap_shared_mapping_range(struct address_space *mapping, > diff --git a/mm/memory.c b/mm/memory.c > index cb433662af21..92d58309cf45 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -4269,13 +4269,8 @@ int __follow_pte_pmd(struct mm_struct *mm, unsigned long address, > static inline int follow_pte(struct mm_struct *mm, unsigned long address, > pte_t **ptepp, spinlock_t **ptlp) > { > - int res; > - > - /* (void) is needed to make gcc happy */ > - (void) __cond_lock(*ptlp, > - !(res = __follow_pte_pmd(mm, address, NULL, NULL, > - ptepp, NULL, ptlp))); > - return res; > + return __cond_lock_err(*ptlp, __follow_pte_pmd(mm, address, NULL, NULL, > + ptepp, NULL, ptlp)); > } > > /** > -- > 2.15.1 > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>