From: Michal Hocko <mhocko@suse.com>
To: Feng Tang <feng.tang@intel.com>
Cc: linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org>,
David Rientjes <rientjes@google.com>,
Dave Hansen <dave.hansen@intel.com>,
Ben Widawsky <ben.widawsky@intel.com>,
linux-kernel@vger.kernel.org,
Andrea Arcangeli <aarcange@redhat.com>,
Mel Gorman <mgorman@techsingularity.net>,
Mike Kravetz <mike.kravetz@oracle.com>,
Randy Dunlap <rdunlap@infradead.org>,
Vlastimil Babka <vbabka@suse.cz>, Andi Kleen <ak@linux.intel.com>,
Dan Williams <dan.j.williams@intel.com>,
ying.huang@intel.com
Subject: Re: [PATCH v1 2/4] mm/mempolicy: unify the preprocessing for mbind and set_mempolicy
Date: Thu, 27 May 2021 09:39:49 +0200 [thread overview]
Message-ID: <YK9MxT8Bwt/TnqWa@dhcp22.suse.cz> (raw)
In-Reply-To: <1622005302-23027-3-git-send-email-feng.tang@intel.com>
On Wed 26-05-21 13:01:40, Feng Tang wrote:
> Currently the kernel_mbind() and kernel_set_mempolicy() do almost
> the same operation for parameter sanity check and preprocessing.
>
> Add a helper function to unify the code to reduce the redundancy,
> and make it easier for changing the pre-processing code in future.
>
> [thanks to David Rientjes for suggesting using helper function
> instead of macro]
I appreciate removing the code duplication but I am not really convinced
this is an improvement. You are conflating two things. One is the mpol
flags checking and node mask copying. While abstracting the first one
makes sense to me the later is already a single line of code that makes
your helper unnecessarily complex. So I would go with sanitize_mpol_flags
and put a flags handling there and leave get_nodes alone.
> Signed-off-by: Feng Tang <feng.tang@intel.com>
> ---
> mm/mempolicy.c | 43 ++++++++++++++++++++++++-------------------
> 1 file changed, 24 insertions(+), 19 deletions(-)
Funny how removing code duplication adds more code than it removes ;)
>
> diff --git a/mm/mempolicy.c b/mm/mempolicy.c
> index 1964cca..2830bb8 100644
> --- a/mm/mempolicy.c
> +++ b/mm/mempolicy.c
> @@ -1460,6 +1460,20 @@ static int copy_nodes_to_user(unsigned long __user *mask, unsigned long maxnode,
> return copy_to_user(mask, nodes_addr(*nodes), copy) ? -EFAULT : 0;
> }
>
> +static inline int mpol_pre_process(int *mode, const unsigned long __user *nmask, unsigned long maxnode, nodemask_t *nodes, unsigned short *flags)
> +{
> + int ret;
> +
> + *flags = *mode & MPOL_MODE_FLAGS;
> + *mode &= ~MPOL_MODE_FLAGS;
> + if ((unsigned int)(*mode) >= MPOL_MAX)
> + return -EINVAL;
> + if ((*flags & MPOL_F_STATIC_NODES) && (*flags & MPOL_F_RELATIVE_NODES))
> + return -EINVAL;
> + ret = get_nodes(nodes, nmask, maxnode);
> + return ret;
> +}
> +
> static long kernel_mbind(unsigned long start, unsigned long len,
> unsigned long mode, const unsigned long __user *nmask,
> unsigned long maxnode, unsigned int flags)
> @@ -1467,19 +1481,14 @@ static long kernel_mbind(unsigned long start, unsigned long len,
> nodemask_t nodes;
> int err;
> unsigned short mode_flags;
> + int lmode = mode;
>
> - start = untagged_addr(start);
> - mode_flags = mode & MPOL_MODE_FLAGS;
> - mode &= ~MPOL_MODE_FLAGS;
> - if (mode >= MPOL_MAX)
> - return -EINVAL;
> - if ((mode_flags & MPOL_F_STATIC_NODES) &&
> - (mode_flags & MPOL_F_RELATIVE_NODES))
> - return -EINVAL;
> - err = get_nodes(&nodes, nmask, maxnode);
> + err = mpol_pre_process(&lmode, nmask, maxnode, &nodes, &mode_flags);
> if (err)
> return err;
> - return do_mbind(start, len, mode, mode_flags, &nodes, flags);
> +
> + start = untagged_addr(start);
> + return do_mbind(start, len, lmode, mode_flags, &nodes, flags);
> }
>
> SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
> @@ -1495,18 +1504,14 @@ static long kernel_set_mempolicy(int mode, const unsigned long __user *nmask,
> {
> int err;
> nodemask_t nodes;
> - unsigned short flags;
> + unsigned short mode_flags;
> + int lmode = mode;
>
> - flags = mode & MPOL_MODE_FLAGS;
> - mode &= ~MPOL_MODE_FLAGS;
> - if ((unsigned int)mode >= MPOL_MAX)
> - return -EINVAL;
> - if ((flags & MPOL_F_STATIC_NODES) && (flags & MPOL_F_RELATIVE_NODES))
> - return -EINVAL;
> - err = get_nodes(&nodes, nmask, maxnode);
> + err = mpol_pre_process(&lmode, nmask, maxnode, &nodes, &mode_flags);
> if (err)
> return err;
> - return do_set_mempolicy(mode, flags, &nodes);
> +
> + return do_set_mempolicy(lmode, mode_flags, &nodes);
> }
>
> SYSCALL_DEFINE3(set_mempolicy, int, mode, const unsigned long __user *, nmask,
> --
> 2.7.4
--
Michal Hocko
SUSE Labs
next prev parent reply other threads:[~2021-05-27 7:39 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-26 5:01 [PATCH v1 0/4] mm/mempolicy: some fix and semantics cleanup Feng Tang
2021-05-26 5:01 ` [PATCH v1 1/4] mm/mempolicy: skip nodemask intersect check for 'interleave' when oom Feng Tang
2021-05-27 7:30 ` Michal Hocko
2021-05-27 13:05 ` Feng Tang
2021-05-27 13:15 ` Michal Hocko
2021-05-27 13:22 ` Feng Tang
2021-05-26 5:01 ` [PATCH v1 2/4] mm/mempolicy: unify the preprocessing for mbind and set_mempolicy Feng Tang
2021-05-27 7:39 ` Michal Hocko [this message]
2021-05-27 12:31 ` Feng Tang
2021-05-26 5:01 ` [PATCH v1 3/4] mm/mempolicy: don't handle MPOL_LOCAL like a fake MPOL_PREFERRED policy Feng Tang
2021-05-27 8:12 ` Michal Hocko
2021-05-27 12:06 ` Feng Tang
2021-05-27 12:16 ` Michal Hocko
2021-05-26 5:01 ` [PATCH v1 4/4] mm/mempolicy: kill MPOL_F_LOCAL bit Feng Tang
2021-05-27 8:20 ` Michal Hocko
2021-05-27 12:10 ` Feng Tang
2021-05-27 12:26 ` Michal Hocko
2021-05-27 13:34 ` Feng Tang
2021-05-27 15:34 ` Michal Hocko
2021-05-28 4:39 ` Feng Tang
2021-05-31 7:00 ` Michal Hocko
2021-05-31 7:32 ` Feng Tang
2021-05-31 8:22 ` Michal Hocko
2021-05-31 8:29 ` Feng Tang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YK9MxT8Bwt/TnqWa@dhcp22.suse.cz \
--to=mhocko@suse.com \
--cc=aarcange@redhat.com \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=ben.widawsky@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@intel.com \
--cc=feng.tang@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@techsingularity.net \
--cc=mike.kravetz@oracle.com \
--cc=rdunlap@infradead.org \
--cc=rientjes@google.com \
--cc=vbabka@suse.cz \
--cc=ying.huang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox