[Devel] [PATCH RHEL7] Removed warning from kmalloc in function alloc_rootdomain

Denis V. Lunev den at virtuozzo.com
Fri Jul 3 19:19:53 MSK 2020


On 7/3/20 7:12 PM, Valeriy Vdovin wrote:
> 'alloc_rootdomain' is used during cpu hotplug actions when cpu's are
> removed or added. So it's relatively rare occasion. The size of
> allocated structure 'struct root_domain' is ~22k, which is a warnable
> order 3. Because this structure is related to sched domain the code
> accessing it is considered of high priority due to execution in
> scheduling codepaths, so we should not fallback to virtualized page
> continuity in this allocation and suppress order warning instead.
>
> Signed-off-by: Valeriy Vdovin <valeriy.vdovin at virtuozzo.com>
> ---
>  kernel/sched/core.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 3fe0d62..8d14614 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -7141,7 +7141,7 @@ static struct root_domain *alloc_rootdomain(void)
>  {
>  	struct root_domain *rd;
>  
> -	rd = kmalloc(sizeof(*rd), GFP_KERNEL);
> +	rd = kmalloc(sizeof(*rd), GFP_KERNEL | __GFP_ORDER_NOWARN);
>  	if (!rd)
>  		return NULL;
>  
NACK

kvmalloc looks to me MUCH better. This item is no
used in HW operations thus we could use virtually
contiguous allocations.

iris ~/src/git/linux-vz7 $ git diff
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 3fe0d62cc51c..d1c489574284 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7051,7 +7051,7 @@ static void free_rootdomain(struct rcu_head *rcu)
        free_cpumask_var(rd->rto_mask);
        free_cpumask_var(rd->online);
        free_cpumask_var(rd->span);
-       kfree(rd);
+       kvfree(rd);
 }
 
 static void rq_attach_root(struct rq *rq, struct root_domain *rd)
@@ -7141,12 +7141,12 @@ static struct root_domain *alloc_rootdomain(void)
 {
        struct root_domain *rd;
 
-       rd = kmalloc(sizeof(*rd), GFP_KERNEL);
+       rd = kvmalloc(sizeof(*rd), GFP_KERNEL);
        if (!rd)
                return NULL;
 
        if (init_rootdomain(rd) != 0) {
-               kfree(rd);
+               kvfree(rd);
                return NULL;
        }
 
iris ~/src/git/linux-vz7 $


More information about the Devel mailing list