From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751182AbeAUXHT (ORCPT ); Sun, 21 Jan 2018 18:07:19 -0500 Received: from smtp2.provo.novell.com ([137.65.250.81]:41528 "EHLO smtp2.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751028AbeAUXHO (ORCPT ); Sun, 21 Jan 2018 18:07:14 -0500 From: Davidlohr Bueso To: starvik@axis.com, jesper.nilsson@axis.com, akpm@linux-foundation.org Cc: viro@zeniv.linux.org.uk, linux-cris-kernel@axis.com, linux-kernel@vger.kernel.org, Davidlohr Bueso , Davidlohr Bueso Subject: [PATCH] arch/cris: use get_user_pages_fast() Date: Sun, 21 Jan 2018 14:59:29 -0800 Message-Id: <20180121225929.11782-1-dave@stgolabs.net> X-Mailer: git-send-email 2.13.6 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since we currently hold mmap_sem across both gup calls (and nothing more), we can substitute it with two _fast() alternatives and possibly avoid grabbing the lock. This was found while adding mmap_sem wrappers, and was also previously reported by Al: https://lkml.org/lkml/2017/11/17/777 Signed-off-by: Davidlohr Bueso --- arch/cris/arch-v32/drivers/cryptocop.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index d688fe117dca..76f8d3b1d39e 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c @@ -2717,37 +2717,28 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig } } - /* Acquire the mm page semaphore. */ - down_read(¤t->mm->mmap_sem); - - err = get_user_pages((unsigned long int)(oper.indata + prev_ix), - noinpages, - 0, /* read access only for in data */ - inpages, - NULL); + err = get_user_pages_fast((unsigned long int)(oper.indata + prev_ix), + noinpages, + 0, /* read access only for in data */ + inpages); if (err < 0) { - up_read(¤t->mm->mmap_sem); nooutpages = noinpages = 0; - DEBUG_API(printk("cryptocop_ioctl_process: get_user_pages indata\n")); + DEBUG_API(printk("cryptocop_ioctl_process: get_user_pages_fast indata\n")); goto error_cleanup; } noinpages = err; if (oper.do_cipher){ - err = get_user_pages((unsigned long int)oper.cipher_outdata, - nooutpages, - FOLL_WRITE, /* write access for out data */ - outpages, - NULL); - up_read(¤t->mm->mmap_sem); + err = get_user_pages_fast((unsigned long int)oper.cipher_outdata, + nooutpages, + FOLL_WRITE, /* write access for out data */ + outpages); if (err < 0) { nooutpages = 0; - DEBUG_API(printk("cryptocop_ioctl_process: get_user_pages outdata\n")); + DEBUG_API(printk("cryptocop_ioctl_process: get_user_pages_fast outdata\n")); goto error_cleanup; } nooutpages = err; - } else { - up_read(¤t->mm->mmap_sem); } /* Add 6 to nooutpages to make room for possibly inserted buffers for storing digest and -- 2.13.6