diff mbox

linux-generic: use default huge page size

Message ID 1462891527-29359-1-git-send-email-maxim.uvarov@linaro.org
State Superseded
Headers show

Commit Message

Maxim Uvarov May 10, 2016, 2:45 p.m. UTC
odp_shm_reserve() relays on huge page size to round up
requested size. If 1 Gb pages present than parser takes
it first as first alphabetical file name in sysfs. That
lead to issue where all allocations wants 1 GB HP. This
patch takes system default huge pages which are usually 2Mb,
and has to be enough for existence odp example apps and
validation tests.

Reported-by: B.Nousilal <bnousilal@gmail.com>
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/odp_system_info.c | 46 +++++++++++++-------------------
 1 file changed, 18 insertions(+), 28 deletions(-)

Comments

Maxim Uvarov May 11, 2016, 8:43 a.m. UTC | #1
On 11 May 2016 at 10:37, Savolainen, Petri (Nokia - FI/Espoo) <
petri.savolainen@nokia.com> wrote:

> Other option would be to loop though the /sys/kernel/mm/hugepages

> directory and see which size are available (nr_hugepages > 0).



available 1 Gb page and 1000 2Mb page what is your decision which
allocation give what memory? I think in api we need modify call to return
list of available HPs with it's sizes. And if size is closer to maximum HP
size that we can give that HP for requested allocation. For now quickest
way is to use default HP and maybe change api for Tiger release.


> I'd expect that /sys/kernel/mm/... content is better "standardized" than

> proc file content.

> Does all platforms (x86, arm, mips, power, ...) have the same content in

> proc/meminfo?



yes, it has to.


> Does every platform spell "Hugepagesize:" the same way, or is there small

> variation like "HugePageSize:"...

>

>

It's common file for all arches:
look at hugetlb_report_node_meminfo()
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/mm/hugetlb.c?id=refs/tags/v4.6-rc7
which called directly when you read meminfo fs/proc/meminfo.c

Maxim.



> -Petri

>

>

> > -----Original Message-----

> > From: lng-odp [mailto:lng-odp-bounces@lists.linaro.org] On Behalf Of

> Maxim

> > Uvarov

> > Sent: Tuesday, May 10, 2016 5:45 PM

> > To: lng-odp@lists.linaro.org

> > Subject: [lng-odp] [PATCH] linux-generic: use default huge page size

> >

> > odp_shm_reserve() relays on huge page size to round up

> > requested size. If 1 Gb pages present than parser takes

> > it first as first alphabetical file name in sysfs. That

> > lead to issue where all allocations wants 1 GB HP. This

> > patch takes system default huge pages which are usually 2Mb,

> > and has to be enough for existence odp example apps and

> > validation tests.

> >

> > Reported-by: B.Nousilal <bnousilal@gmail.com>

> > Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>

> > ---

> >  platform/linux-generic/odp_system_info.c | 46

> +++++++++++++--------------

> > -----

> >  1 file changed, 18 insertions(+), 28 deletions(-)

> >

> > diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-

> > generic/odp_system_info.c

> > index 0f1f3c7..14244c3 100644

> > --- a/platform/linux-generic/odp_system_info.c

> > +++ b/platform/linux-generic/odp_system_info.c

> > @@ -24,12 +24,9 @@

> >  #include <sys/types.h>

> >  #include <dirent.h>

> >

> > -

> >  #define CACHE_LNSZ_FILE \

> >       "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size"

> >

> > -#define HUGE_PAGE_DIR "/sys/kernel/mm/hugepages"

> > -

> >  /*

> >   * Report the number of logical CPUs detected at boot time

> >   */

> > @@ -77,37 +74,30 @@ static int systemcpu_cache_line_size(void)

> >  #endif

> >

> >

> > -static int huge_page_size(void)

> > +static int default_huge_page_size(void)

> >  {

> > -     DIR *dir;

> > -     struct dirent *dirent;

> > -     int size = 0;

> > +     char str[1024];

> > +     char *pos;

> > +     uint64_t sz;

> > +     FILE *file;

> >

> > -     dir = opendir(HUGE_PAGE_DIR);

> > -     if (dir == NULL) {

> > -             ODP_ERR("%s not found\n", HUGE_PAGE_DIR);

> > -             return 0;

> > -     }

> > -

> > -     while ((dirent = readdir(dir)) != NULL) {

> > -             int temp = 0;

> > -

> > -             if (sscanf(dirent->d_name, "hugepages-%i", &temp) != 1)

> > -                     continue;

> > -

> > -             if (temp > size)

> > -                     size = temp;

> > -     }

> > +     file = fopen("/proc/meminfo", "rt");

> >

> > -     if (closedir(dir)) {

> > -             ODP_ERR("closedir failed\n");

> > -             return 0;

> > +     while (fgets(str, sizeof(str), file) != NULL) {

> > +             pos = strstr(str, "Hugepagesize:");

> > +             if (pos) {

> > +                     *(pos - 1) = '\0';

> > +                     if (sscanf(pos, "@ %ld kB", &sz) == 1) {

> > +                             fclose(file);

> > +                             return sz * 1024;

> > +                     }

> > +             }

> >       }

> >

> > -     return size * 1024;

> > +     fclose(file);

> > +     return 0;

> >  }

> >

> > -

> >  /*

> >   * Analysis of /sys/devices/system/cpu/ files

> >   */

> > @@ -137,7 +127,7 @@ static int systemcpu(odp_system_info_t *sysinfo)

> >               return -1;

> >       }

> >

> > -     sysinfo->huge_page_size = huge_page_size();

> > +     sysinfo->huge_page_size = default_huge_page_size();

> >

> >       return 0;

> >  }

> > --

> > 2.7.1.250.gff4ea60

> >

> > _______________________________________________

> > lng-odp mailing list

> > lng-odp@lists.linaro.org

> > https://lists.linaro.org/mailman/listinfo/lng-odp

>
Maxim Uvarov May 11, 2016, 8:50 a.m. UTC | #2
On 11 May 2016 at 11:43, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

>

>

> On 11 May 2016 at 10:37, Savolainen, Petri (Nokia - FI/Espoo) <

> petri.savolainen@nokia.com> wrote:

>

>> Other option would be to loop though the /sys/kernel/mm/hugepages

>> directory and see which size are available (nr_hugepages > 0).

>

>

> available 1 Gb page and 1000 2Mb page what is your decision which

> allocation give what memory? I think in api we need modify call to return

> list of available HPs with it's sizes. And if size is closer to maximum HP

> size that we can give that HP for requested allocation. For now quickest

> way is to use default HP and maybe change api for Tiger release.

>

>

>> I'd expect that /sys/kernel/mm/... content is better "standardized" than

>> proc file content.

>> Does all platforms (x86, arm, mips, power, ...) have the same content in

>> proc/meminfo?

>

>

> yes, it has to.

>

>

>> Does every platform spell "Hugepagesize:" the same way, or is there small

>> variation like "HugePageSize:"...

>>

>>

> It's common file for all arches:

> look at hugetlb_report_node_meminfo()

>



hugetlb_report_meminfo()  function.

Maxim.


>

> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/mm/hugetlb.c?id=refs/tags/v4.6-rc7

> which called directly when you read meminfo fs/proc/meminfo.c

>

> Maxim.

>

>

>

>> -Petri

>>

>>

>> > -----Original Message-----

>> > From: lng-odp [mailto:lng-odp-bounces@lists.linaro.org] On Behalf Of

>> Maxim

>> > Uvarov

>> > Sent: Tuesday, May 10, 2016 5:45 PM

>> > To: lng-odp@lists.linaro.org

>> > Subject: [lng-odp] [PATCH] linux-generic: use default huge page size

>> >

>> > odp_shm_reserve() relays on huge page size to round up

>> > requested size. If 1 Gb pages present than parser takes

>> > it first as first alphabetical file name in sysfs. That

>> > lead to issue where all allocations wants 1 GB HP. This

>> > patch takes system default huge pages which are usually 2Mb,

>> > and has to be enough for existence odp example apps and

>> > validation tests.

>> >

>> > Reported-by: B.Nousilal <bnousilal@gmail.com>

>> > Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>

>> > ---

>> >  platform/linux-generic/odp_system_info.c | 46

>> +++++++++++++--------------

>> > -----

>> >  1 file changed, 18 insertions(+), 28 deletions(-)

>> >

>> > diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-

>> > generic/odp_system_info.c

>> > index 0f1f3c7..14244c3 100644

>> > --- a/platform/linux-generic/odp_system_info.c

>> > +++ b/platform/linux-generic/odp_system_info.c

>> > @@ -24,12 +24,9 @@

>> >  #include <sys/types.h>

>> >  #include <dirent.h>

>> >

>> > -

>> >  #define CACHE_LNSZ_FILE \

>> >       "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size"

>> >

>> > -#define HUGE_PAGE_DIR "/sys/kernel/mm/hugepages"

>> > -

>> >  /*

>> >   * Report the number of logical CPUs detected at boot time

>> >   */

>> > @@ -77,37 +74,30 @@ static int systemcpu_cache_line_size(void)

>> >  #endif

>> >

>> >

>> > -static int huge_page_size(void)

>> > +static int default_huge_page_size(void)

>> >  {

>> > -     DIR *dir;

>> > -     struct dirent *dirent;

>> > -     int size = 0;

>> > +     char str[1024];

>> > +     char *pos;

>> > +     uint64_t sz;

>> > +     FILE *file;

>> >

>> > -     dir = opendir(HUGE_PAGE_DIR);

>> > -     if (dir == NULL) {

>> > -             ODP_ERR("%s not found\n", HUGE_PAGE_DIR);

>> > -             return 0;

>> > -     }

>> > -

>> > -     while ((dirent = readdir(dir)) != NULL) {

>> > -             int temp = 0;

>> > -

>> > -             if (sscanf(dirent->d_name, "hugepages-%i", &temp) != 1)

>> > -                     continue;

>> > -

>> > -             if (temp > size)

>> > -                     size = temp;

>> > -     }

>> > +     file = fopen("/proc/meminfo", "rt");

>> >

>> > -     if (closedir(dir)) {

>> > -             ODP_ERR("closedir failed\n");

>> > -             return 0;

>> > +     while (fgets(str, sizeof(str), file) != NULL) {

>> > +             pos = strstr(str, "Hugepagesize:");

>> > +             if (pos) {

>> > +                     *(pos - 1) = '\0';

>> > +                     if (sscanf(pos, "@ %ld kB", &sz) == 1) {

>> > +                             fclose(file);

>> > +                             return sz * 1024;

>> > +                     }

>> > +             }

>> >       }

>> >

>> > -     return size * 1024;

>> > +     fclose(file);

>> > +     return 0;

>> >  }

>> >

>> > -

>> >  /*

>> >   * Analysis of /sys/devices/system/cpu/ files

>> >   */

>> > @@ -137,7 +127,7 @@ static int systemcpu(odp_system_info_t *sysinfo)

>> >               return -1;

>> >       }

>> >

>> > -     sysinfo->huge_page_size = huge_page_size();

>> > +     sysinfo->huge_page_size = default_huge_page_size();

>> >

>> >       return 0;

>> >  }

>> > --

>> > 2.7.1.250.gff4ea60

>> >

>> > _______________________________________________

>> > lng-odp mailing list

>> > lng-odp@lists.linaro.org

>> > https://lists.linaro.org/mailman/listinfo/lng-odp

>>

>

>
diff mbox

Patch

diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-generic/odp_system_info.c
index 0f1f3c7..14244c3 100644
--- a/platform/linux-generic/odp_system_info.c
+++ b/platform/linux-generic/odp_system_info.c
@@ -24,12 +24,9 @@ 
 #include <sys/types.h>
 #include <dirent.h>
 
-
 #define CACHE_LNSZ_FILE \
 	"/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size"
 
-#define HUGE_PAGE_DIR "/sys/kernel/mm/hugepages"
-
 /*
  * Report the number of logical CPUs detected at boot time
  */
@@ -77,37 +74,30 @@  static int systemcpu_cache_line_size(void)
 #endif
 
 
-static int huge_page_size(void)
+static int default_huge_page_size(void)
 {
-	DIR *dir;
-	struct dirent *dirent;
-	int size = 0;
+	char str[1024];
+	char *pos;
+	uint64_t sz;
+	FILE *file;
 
-	dir = opendir(HUGE_PAGE_DIR);
-	if (dir == NULL) {
-		ODP_ERR("%s not found\n", HUGE_PAGE_DIR);
-		return 0;
-	}
-
-	while ((dirent = readdir(dir)) != NULL) {
-		int temp = 0;
-
-		if (sscanf(dirent->d_name, "hugepages-%i", &temp) != 1)
-			continue;
-
-		if (temp > size)
-			size = temp;
-	}
+	file = fopen("/proc/meminfo", "rt");
 
-	if (closedir(dir)) {
-		ODP_ERR("closedir failed\n");
-		return 0;
+	while (fgets(str, sizeof(str), file) != NULL) {
+		pos = strstr(str, "Hugepagesize:");
+		if (pos) {
+			*(pos - 1) = '\0';
+			if (sscanf(pos, "@ %ld kB", &sz) == 1) {
+				fclose(file);
+				return sz * 1024;
+			}
+		}
 	}
 
-	return size * 1024;
+	fclose(file);
+	return 0;
 }
 
-
 /*
  * Analysis of /sys/devices/system/cpu/ files
  */
@@ -137,7 +127,7 @@  static int systemcpu(odp_system_info_t *sysinfo)
 		return -1;
 	}
 
-	sysinfo->huge_page_size = huge_page_size();
+	sysinfo->huge_page_size = default_huge_page_size();
 
 	return 0;
 }