[PATCH 14/18] mm: numa: Limit scope of lock for NUMA migrate rate limiting

2013-12-10 Thread Mel Gorman
NUMA migrate rate limiting protects a migration counter and window using
a lock but in some cases this can be a contended lock. It is not
critical that the number of pages be perfect, lost updates are
acceptable. Reduce the importance of this lock.

Signed-off-by: Mel Gorman 
Reviewed-by: Rik van Riel 
---
 include/linux/mmzone.h |  5 +
 mm/migrate.c   | 21 -
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index bd791e4..b835d3f 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -758,10 +758,7 @@ typedef struct pglist_data {
int kswapd_max_order;
enum zone_type classzone_idx;
 #ifdef CONFIG_NUMA_BALANCING
-   /*
-* Lock serializing the per destination node AutoNUMA memory
-* migration rate limiting data.
-*/
+   /* Lock serializing the migrate rate limiting window */
spinlock_t numabalancing_migrate_lock;
 
/* Rate limiting time interval */
diff --git a/mm/migrate.c b/mm/migrate.c
index b6eef65..564d5c9 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1596,26 +1596,29 @@ bool migrate_ratelimited(int node)
 static bool numamigrate_update_ratelimit(pg_data_t *pgdat,
unsigned long nr_pages)
 {
-   bool rate_limited = false;
-
/*
 * Rate-limit the amount of data that is being migrated to a node.
 * Optimal placement is no good if the memory bus is saturated and
 * all the time is being spent migrating!
 */
-   spin_lock(>numabalancing_migrate_lock);
if (time_after(jiffies, pgdat->numabalancing_migrate_next_window)) {
+   spin_lock(>numabalancing_migrate_lock);
pgdat->numabalancing_migrate_nr_pages = 0;
pgdat->numabalancing_migrate_next_window = jiffies +
msecs_to_jiffies(migrate_interval_millisecs);
+   spin_unlock(>numabalancing_migrate_lock);
}
if (pgdat->numabalancing_migrate_nr_pages > ratelimit_pages)
-   rate_limited = true;
-   else
-   pgdat->numabalancing_migrate_nr_pages += nr_pages;
-   spin_unlock(>numabalancing_migrate_lock);
-   
-   return rate_limited;
+   return true;
+
+   /*
+* This is an unlocked non-atomic update so errors are possible.
+* The consequences are failing to migrate when we potentiall should
+* have which is not severe enough to warrant locking. If it is ever
+* a problem, it can be converted to a per-cpu counter.
+*/
+   pgdat->numabalancing_migrate_nr_pages += nr_pages;
+   return false;
 }
 
 static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 14/18] mm: numa: Limit scope of lock for NUMA migrate rate limiting

2013-12-10 Thread Mel Gorman
NUMA migrate rate limiting protects a migration counter and window using
a lock but in some cases this can be a contended lock. It is not
critical that the number of pages be perfect, lost updates are
acceptable. Reduce the importance of this lock.

Signed-off-by: Mel Gorman mgor...@suse.de
Reviewed-by: Rik van Riel r...@redhat.com
---
 include/linux/mmzone.h |  5 +
 mm/migrate.c   | 21 -
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index bd791e4..b835d3f 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -758,10 +758,7 @@ typedef struct pglist_data {
int kswapd_max_order;
enum zone_type classzone_idx;
 #ifdef CONFIG_NUMA_BALANCING
-   /*
-* Lock serializing the per destination node AutoNUMA memory
-* migration rate limiting data.
-*/
+   /* Lock serializing the migrate rate limiting window */
spinlock_t numabalancing_migrate_lock;
 
/* Rate limiting time interval */
diff --git a/mm/migrate.c b/mm/migrate.c
index b6eef65..564d5c9 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1596,26 +1596,29 @@ bool migrate_ratelimited(int node)
 static bool numamigrate_update_ratelimit(pg_data_t *pgdat,
unsigned long nr_pages)
 {
-   bool rate_limited = false;
-
/*
 * Rate-limit the amount of data that is being migrated to a node.
 * Optimal placement is no good if the memory bus is saturated and
 * all the time is being spent migrating!
 */
-   spin_lock(pgdat-numabalancing_migrate_lock);
if (time_after(jiffies, pgdat-numabalancing_migrate_next_window)) {
+   spin_lock(pgdat-numabalancing_migrate_lock);
pgdat-numabalancing_migrate_nr_pages = 0;
pgdat-numabalancing_migrate_next_window = jiffies +
msecs_to_jiffies(migrate_interval_millisecs);
+   spin_unlock(pgdat-numabalancing_migrate_lock);
}
if (pgdat-numabalancing_migrate_nr_pages  ratelimit_pages)
-   rate_limited = true;
-   else
-   pgdat-numabalancing_migrate_nr_pages += nr_pages;
-   spin_unlock(pgdat-numabalancing_migrate_lock);
-   
-   return rate_limited;
+   return true;
+
+   /*
+* This is an unlocked non-atomic update so errors are possible.
+* The consequences are failing to migrate when we potentiall should
+* have which is not severe enough to warrant locking. If it is ever
+* a problem, it can be converted to a per-cpu counter.
+*/
+   pgdat-numabalancing_migrate_nr_pages += nr_pages;
+   return false;
 }
 
 static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
-- 
1.8.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 14/18] mm: numa: Limit scope of lock for NUMA migrate rate limiting

2013-12-09 Thread Rik van Riel
On 12/09/2013 02:09 AM, Mel Gorman wrote:
> NUMA migrate rate limiting protects a migration counter and window using
> a lock but in some cases this can be a contended lock. It is not
> critical that the number of pages be perfect, lost updates are
> acceptable. Reduce the importance of this lock.
> 
> Signed-off-by: Mel Gorman 

Reviewed-by: Rik van Riel 


-- 
All rights reversed
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 14/18] mm: numa: Limit scope of lock for NUMA migrate rate limiting

2013-12-09 Thread Rik van Riel
On 12/09/2013 02:09 AM, Mel Gorman wrote:
 NUMA migrate rate limiting protects a migration counter and window using
 a lock but in some cases this can be a contended lock. It is not
 critical that the number of pages be perfect, lost updates are
 acceptable. Reduce the importance of this lock.
 
 Signed-off-by: Mel Gorman mgor...@suse.de

Reviewed-by: Rik van Riel r...@redhat.com


-- 
All rights reversed
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 14/18] mm: numa: Limit scope of lock for NUMA migrate rate limiting

2013-12-08 Thread Mel Gorman
NUMA migrate rate limiting protects a migration counter and window using
a lock but in some cases this can be a contended lock. It is not
critical that the number of pages be perfect, lost updates are
acceptable. Reduce the importance of this lock.

Signed-off-by: Mel Gorman 
---
 include/linux/mmzone.h |  5 +
 mm/migrate.c   | 21 -
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index bd791e4..b835d3f 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -758,10 +758,7 @@ typedef struct pglist_data {
int kswapd_max_order;
enum zone_type classzone_idx;
 #ifdef CONFIG_NUMA_BALANCING
-   /*
-* Lock serializing the per destination node AutoNUMA memory
-* migration rate limiting data.
-*/
+   /* Lock serializing the migrate rate limiting window */
spinlock_t numabalancing_migrate_lock;
 
/* Rate limiting time interval */
diff --git a/mm/migrate.c b/mm/migrate.c
index 77147bd..8b560d5 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1596,26 +1596,29 @@ bool migrate_ratelimited(int node)
 static bool numamigrate_update_ratelimit(pg_data_t *pgdat,
unsigned long nr_pages)
 {
-   bool rate_limited = false;
-
/*
 * Rate-limit the amount of data that is being migrated to a node.
 * Optimal placement is no good if the memory bus is saturated and
 * all the time is being spent migrating!
 */
-   spin_lock(>numabalancing_migrate_lock);
if (time_after(jiffies, pgdat->numabalancing_migrate_next_window)) {
+   spin_lock(>numabalancing_migrate_lock);
pgdat->numabalancing_migrate_nr_pages = 0;
pgdat->numabalancing_migrate_next_window = jiffies +
msecs_to_jiffies(migrate_interval_millisecs);
+   spin_unlock(>numabalancing_migrate_lock);
}
if (pgdat->numabalancing_migrate_nr_pages > ratelimit_pages)
-   rate_limited = true;
-   else
-   pgdat->numabalancing_migrate_nr_pages += nr_pages;
-   spin_unlock(>numabalancing_migrate_lock);
-   
-   return rate_limited;
+   return true;
+
+   /*
+* This is an unlocked non-atomic update so errors are possible.
+* The consequences are failing to migrate when we potentiall should
+* have which is not severe enough to warrant locking. If it is ever
+* a problem, it can be converted to a per-cpu counter.
+*/
+   pgdat->numabalancing_migrate_nr_pages += nr_pages;
+   return false;
 }
 
 static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 14/18] mm: numa: Limit scope of lock for NUMA migrate rate limiting

2013-12-08 Thread Mel Gorman
NUMA migrate rate limiting protects a migration counter and window using
a lock but in some cases this can be a contended lock. It is not
critical that the number of pages be perfect, lost updates are
acceptable. Reduce the importance of this lock.

Signed-off-by: Mel Gorman mgor...@suse.de
---
 include/linux/mmzone.h |  5 +
 mm/migrate.c   | 21 -
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index bd791e4..b835d3f 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -758,10 +758,7 @@ typedef struct pglist_data {
int kswapd_max_order;
enum zone_type classzone_idx;
 #ifdef CONFIG_NUMA_BALANCING
-   /*
-* Lock serializing the per destination node AutoNUMA memory
-* migration rate limiting data.
-*/
+   /* Lock serializing the migrate rate limiting window */
spinlock_t numabalancing_migrate_lock;
 
/* Rate limiting time interval */
diff --git a/mm/migrate.c b/mm/migrate.c
index 77147bd..8b560d5 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1596,26 +1596,29 @@ bool migrate_ratelimited(int node)
 static bool numamigrate_update_ratelimit(pg_data_t *pgdat,
unsigned long nr_pages)
 {
-   bool rate_limited = false;
-
/*
 * Rate-limit the amount of data that is being migrated to a node.
 * Optimal placement is no good if the memory bus is saturated and
 * all the time is being spent migrating!
 */
-   spin_lock(pgdat-numabalancing_migrate_lock);
if (time_after(jiffies, pgdat-numabalancing_migrate_next_window)) {
+   spin_lock(pgdat-numabalancing_migrate_lock);
pgdat-numabalancing_migrate_nr_pages = 0;
pgdat-numabalancing_migrate_next_window = jiffies +
msecs_to_jiffies(migrate_interval_millisecs);
+   spin_unlock(pgdat-numabalancing_migrate_lock);
}
if (pgdat-numabalancing_migrate_nr_pages  ratelimit_pages)
-   rate_limited = true;
-   else
-   pgdat-numabalancing_migrate_nr_pages += nr_pages;
-   spin_unlock(pgdat-numabalancing_migrate_lock);
-   
-   return rate_limited;
+   return true;
+
+   /*
+* This is an unlocked non-atomic update so errors are possible.
+* The consequences are failing to migrate when we potentiall should
+* have which is not severe enough to warrant locking. If it is ever
+* a problem, it can be converted to a per-cpu counter.
+*/
+   pgdat-numabalancing_migrate_nr_pages += nr_pages;
+   return false;
 }
 
 static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
-- 
1.8.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/