All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chu,Kaiping" <chukaiping@baidu.com>
To: Charan Teja Reddy <charante@codeaurora.org>,
	"akpm@linux-foundation.org" <akpm@linux-foundation.org>,
	"mcgrof@kernel.org" <mcgrof@kernel.org>,
	"keescook@chromium.org" <keescook@chromium.org>,
	"yzaikin@google.com" <yzaikin@google.com>,
	"vbabka@suse.cz" <vbabka@suse.cz>,
	"nigupta@nvidia.com" <nigupta@nvidia.com>,
	"bhe@redhat.com" <bhe@redhat.com>,
	"mateusznosek0@gmail.com" <mateusznosek0@gmail.com>,
	"sh_def@163.com" <sh_def@163.com>,
	"iamjoonsoo.kim@lge.com" <iamjoonsoo.kim@lge.com>,
	"vinmenon@codeaurora.org" <vinmenon@codeaurora.org>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>
Subject: 答复: [PATCH V2] mm: compaction: support triggering of proactive compaction by user
Date: Wed, 19 May 2021 01:41:37 +0000	[thread overview]
Message-ID: <79279be3573542dea0266f8e9d4d5368@baidu.com> (raw)
In-Reply-To: <1621345058-26676-1-git-send-email-charante@codeaurora.org>



> -----邮件原件-----
> 发件人: charante=codeaurora.org@mg.codeaurora.org
> <charante=codeaurora.org@mg.codeaurora.org> 代表 Charan Teja Reddy
> 发送时间: 2021年5月18日 21:38
> 收件人: akpm@linux-foundation.org; mcgrof@kernel.org;
> keescook@chromium.org; yzaikin@google.com; vbabka@suse.cz;
> nigupta@nvidia.com; bhe@redhat.com; mateusznosek0@gmail.com;
> sh_def@163.com; iamjoonsoo.kim@lge.com; vinmenon@codeaurora.org
> 抄送: linux-kernel@vger.kernel.org; linux-mm@kvack.org;
> linux-fsdevel@vger.kernel.org; Charan Teja Reddy <charante@codeaurora.org>
> 主题: [PATCH V2] mm: compaction: support triggering of proactive
> compaction by user
> 
> The proactive compaction[1] gets triggered for every 500msec and run
> compaction on the node for COMPACTION_HPAGE_ORDER (usually order-9)
> pages based on the value set to sysctl.compaction_proactiveness.
> Triggering the compaction for every 500msec in search of
> COMPACTION_HPAGE_ORDER pages is not needed for all applications,
> especially on the embedded system usecases which may have few MB's of
> RAM. Enabling the proactive compaction in its state will endup in running
> almost always on such systems.
> 
> Other side, proactive compaction can still be very much useful for getting a set
> of higher order pages in some controllable manner(controlled by using the
> sysctl.compaction_proactiveness). Thus on systems where enabling the
> proactive compaction always may proove not required, can trigger the same
> from user space on write to its sysctl interface. As an example, say app
> launcher decide to launch the memory heavy application which can be
> launched fast if it gets more higher order pages thus launcher can prepare the
> system in advance by triggering the proactive compaction from userspace.
> 
> This triggering of proactive compaction is done on a write to
> sysctl.compaction_proactiveness by user.

If you want to trigger compaction from userspace, you can use " echo 1 > /proc/sys/vm/compact_memory", there is no need to be so complex.

> 
> [1]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?i
> d=facdaa917c4d5a376d09d25865f5a863f906234a
> 
> Signed-off-by: Charan Teja Reddy <charante@codeaurora.org>
> ---
> changes in V2:
>     - remove /proc interface trigger for proactive compaction
>     - Intention is same that add a way to trigger proactive compaction by user.
> 
> changes in V1:
>     -
> https://lore.kernel.org/lkml/1619098678-8501-1-git-send-email-charante@co
> deaurora.org/
> 
>  include/linux/compaction.h |  2 ++
>  include/linux/mmzone.h     |  1 +
>  kernel/sysctl.c            |  2 +-
>  mm/compaction.c            | 35
> ++++++++++++++++++++++++++++++++---
>  4 files changed, 36 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/compaction.h b/include/linux/compaction.h index
> 4221888..04d5d9f 100644
> --- a/include/linux/compaction.h
> +++ b/include/linux/compaction.h
> @@ -84,6 +84,8 @@ static inline unsigned long compact_gap(unsigned int
> order)  extern unsigned int sysctl_compaction_proactiveness;  extern int
> sysctl_compaction_handler(struct ctl_table *table, int write,
>  			void *buffer, size_t *length, loff_t *ppos);
> +extern int compaction_proactiveness_sysctl_handler(struct ctl_table *table,
> +		int write, void *buffer, size_t *length, loff_t *ppos);
>  extern int sysctl_extfrag_threshold;
>  extern int sysctl_compact_unevictable_allowed;
> 
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index
> 0d53eba..9455809 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -815,6 +815,7 @@ typedef struct pglist_data {
>  	enum zone_type kcompactd_highest_zoneidx;
>  	wait_queue_head_t kcompactd_wait;
>  	struct task_struct *kcompactd;
> +	bool proactive_compact_trigger;
>  #endif
>  	/*
>  	 * This is a per-node reserve of pages that are not available diff --git
> a/kernel/sysctl.c b/kernel/sysctl.c index 14edf84..bed2fad 100644
> --- a/kernel/sysctl.c
> +++ b/kernel/sysctl.c
> @@ -2840,7 +2840,7 @@ static struct ctl_table vm_table[] = {
>  		.data		= &sysctl_compaction_proactiveness,
>  		.maxlen		= sizeof(sysctl_compaction_proactiveness),
>  		.mode		= 0644,
> -		.proc_handler	= proc_dointvec_minmax,
> +		.proc_handler	= compaction_proactiveness_sysctl_handler,
>  		.extra1		= SYSCTL_ZERO,
>  		.extra2		= &one_hundred,
>  	},
> diff --git a/mm/compaction.c b/mm/compaction.c index 84fde27..9056693
> 100644
> --- a/mm/compaction.c
> +++ b/mm/compaction.c
> @@ -2708,6 +2708,30 @@ static void compact_nodes(void)
>   */
>  unsigned int __read_mostly sysctl_compaction_proactiveness = 20;
> 
> +int compaction_proactiveness_sysctl_handler(struct ctl_table *table, int
> write,
> +		void *buffer, size_t *length, loff_t *ppos) {
> +	int rc, nid;
> +
> +	rc = proc_dointvec_minmax(table, write, buffer, length, ppos);
> +	if (rc)
> +		return rc;
> +
> +	if (write && sysctl_compaction_proactiveness) {
> +		for_each_online_node(nid) {
> +			pg_data_t *pgdat = NODE_DATA(nid);
> +
> +			if (pgdat->proactive_compact_trigger)
> +				continue;
> +
> +			pgdat->proactive_compact_trigger = true;
> +			wake_up_interruptible(&pgdat->kcompactd_wait);
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  /*
>   * This is the entry point for compacting all nodes via
>   * /proc/sys/vm/compact_memory
> @@ -2752,7 +2776,8 @@ void compaction_unregister_node(struct node
> *node)
> 
>  static inline bool kcompactd_work_requested(pg_data_t *pgdat)  {
> -	return pgdat->kcompactd_max_order > 0 || kthread_should_stop();
> +	return pgdat->kcompactd_max_order > 0 || kthread_should_stop() ||
> +		pgdat->proactive_compact_trigger;
>  }
> 
>  static bool kcompactd_node_suitable(pg_data_t *pgdat) @@ -2905,7
> +2930,8 @@ static int kcompactd(void *p)
>  		trace_mm_compaction_kcompactd_sleep(pgdat->node_id);
>  		if (wait_event_freezable_timeout(pgdat->kcompactd_wait,
>  			kcompactd_work_requested(pgdat),
> -			msecs_to_jiffies(HPAGE_FRAG_CHECK_INTERVAL_MSEC))) {
> +			msecs_to_jiffies(HPAGE_FRAG_CHECK_INTERVAL_MSEC)) &&
> +			!pgdat->proactive_compact_trigger) {
> 
>  			psi_memstall_enter(&pflags);
>  			kcompactd_do_work(pgdat);
> @@ -2919,7 +2945,7 @@ static int kcompactd(void *p)
> 
>  			if (proactive_defer) {
>  				proactive_defer--;
> -				continue;
> +				goto loop;
>  			}
>  			prev_score = fragmentation_score_node(pgdat);
>  			proactive_compact_node(pgdat);
> @@ -2931,6 +2957,9 @@ static int kcompactd(void *p)
>  			proactive_defer = score < prev_score ?
>  					0 : 1 << COMPACT_MAX_DEFER_SHIFT;
>  		}
> +loop:
> +		if (pgdat->proactive_compact_trigger)
> +			pgdat->proactive_compact_trigger = false;
>  	}
> 
>  	return 0;
> --
> QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a
> member of the Code Aurora Forum, hosted by The Linux Foundation


  reply	other threads:[~2021-05-19  1:41 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-18 13:37 [PATCH V2] mm: compaction: support triggering of proactive compaction by user Charan Teja Reddy
2021-05-19  1:41 ` Chu,Kaiping [this message]
2021-05-19 10:19   ` 答复: " Charan Teja Kalla
2021-05-25 14:20 ` Charan Teja Kalla
2021-05-25 20:35 ` Nitin Gupta
2021-05-27  9:28   ` Charan Teja Kalla
2021-05-27 23:52     ` Nitin Gupta
2021-05-29  2:57       ` Charan Teja Kalla
2021-05-28 15:19 ` Vlastimil Babka
2021-05-28 17:02   ` Charan Teja Kalla

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=79279be3573542dea0266f8e9d4d5368@baidu.com \
    --to=chukaiping@baidu.com \
    --cc=akpm@linux-foundation.org \
    --cc=bhe@redhat.com \
    --cc=charante@codeaurora.org \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=keescook@chromium.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mateusznosek0@gmail.com \
    --cc=mcgrof@kernel.org \
    --cc=nigupta@nvidia.com \
    --cc=sh_def@163.com \
    --cc=vbabka@suse.cz \
    --cc=vinmenon@codeaurora.org \
    --cc=yzaikin@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.