1
1
Этот коммит содержится в:
Mike Dubman 2014-10-24 17:21:46 +03:00
родитель 8da6c14e06
Коммит 5ce2f10067
5 изменённых файлов: 56 добавлений и 41 удалений

Просмотреть файл

@ -264,7 +264,9 @@ segment_attach(map_segment_t *ds_buf, sshmem_mkey_t *mkey)
ds_buf->seg_size,
PROT_READ | PROT_WRITE,
MAP_SHARED |
#if defined(MAP_ANONYMOUS)
MAP_ANONYMOUS |
#endif
MAP_FIXED,
-1,
0);

Просмотреть файл

@ -38,36 +38,8 @@ typedef struct mca_sshmem_sysv_module_t {
} mca_sshmem_sysv_module_t;
extern mca_sshmem_sysv_module_t mca_sshmem_sysv_module;
/*
* Get current huge page size
*/
static size_t oshmem_gethugepagesize(void)
{
static size_t huge_page_size = 0;
char buf[256];
int size_kb;
FILE *f;
OSHMEM_MODULE_DECLSPEC extern size_t sshmem_sysv_gethugepagesize(void);
/* Cache the huge page size value */
if (huge_page_size == 0) {
f = fopen("/proc/meminfo", "r");
if (f != NULL) {
while (fgets(buf, sizeof(buf), f)) {
if (sscanf(buf, "Hugepagesize: %d kB", &size_kb) == 1) {
huge_page_size = size_kb * 1024L;
break;
}
}
fclose(f);
}
if (huge_page_size == 0) {
huge_page_size = 2 * 1024L *1024L;
}
}
return huge_page_size;
}
END_C_DECLS
#endif /* MCA_SSHMEM_SYSV_EXPORT_H */

Просмотреть файл

@ -104,6 +104,9 @@ sysv_runtime_query(mca_base_module_t **module,
char *addr = NULL;
struct shmid_ds tmp_buff;
int flags;
int ret;
ret = OSHMEM_SUCCESS;
*priority = 0;
*module = NULL;
@ -111,11 +114,12 @@ sysv_runtime_query(mca_base_module_t **module,
/* if we are here, then let the run-time test games begin */
#if defined (SHM_HUGETLB)
if (mca_sshmem_sysv_component.use_hp > 0) {
if (mca_sshmem_sysv_component.use_hp != 0) {
flags = IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | SHM_HUGETLB;
if (-1 == (shmid = shmget(IPC_PRIVATE, oshmem_gethugepagesize(), flags))) {
if (-1 == (shmid = shmget(IPC_PRIVATE, sshmem_sysv_gethugepagesize(), flags))) {
if (mca_sshmem_sysv_component.use_hp == 1) {
mca_sshmem_sysv_component.use_hp = 0;
ret = OSHMEM_ERR_NOT_AVAILABLE;
goto out;
}
mca_sshmem_sysv_component.use_hp = 0;
@ -124,6 +128,7 @@ sysv_runtime_query(mca_base_module_t **module,
shmctl(shmid, IPC_RMID, NULL);
if (mca_sshmem_sysv_component.use_hp == 1) {
mca_sshmem_sysv_component.use_hp = 0;
ret = OSHMEM_ERR_NOT_AVAILABLE;
goto out;
}
mca_sshmem_sysv_component.use_hp = 0;
@ -132,6 +137,7 @@ sysv_runtime_query(mca_base_module_t **module,
#else
if (mca_sshmem_sysv_component.use_hp == 1) {
mca_sshmem_sysv_component.use_hp = 0;
ret = OSHMEM_ERR_NOT_AVAILABLE;
goto out;
}
mca_sshmem_sysv_component.use_hp = 0;
@ -140,10 +146,12 @@ sysv_runtime_query(mca_base_module_t **module,
if (0 == mca_sshmem_sysv_component.use_hp) {
flags = IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR;
if (-1 == (shmid = shmget(IPC_PRIVATE, (size_t)(opal_getpagesize()), flags))) {
ret = OSHMEM_ERR_NOT_AVAILABLE;
goto out;
}
else if ((void *)-1 == (addr = shmat(shmid, NULL, 0))) {
shmctl(shmid, IPC_RMID, NULL);
ret = OSHMEM_ERR_NOT_AVAILABLE;
goto out;
}
}
@ -168,7 +176,7 @@ sysv_runtime_query(mca_base_module_t **module,
if ((char *)-1 != addr) {
shmdt(addr);
}
return OSHMEM_SUCCESS;
return ret;
}
/* ////////////////////////////////////////////////////////////////////////// */
@ -186,12 +194,12 @@ sysv_register(void)
MCA_BASE_VAR_SCOPE_ALL_EQ,
&mca_sshmem_sysv_component.priority);
mca_sshmem_sysv_component.use_hp = 2;
mca_sshmem_sysv_component.use_hp = -1;
mca_base_component_var_register (&mca_sshmem_sysv_component.super.base_version,
"use_hp", "Huge pages usage "
"[0 - off, 1 - on, 2 - auto] (default: 2)", MCA_BASE_VAR_TYPE_INT,
"[0 - off, 1 - on, -1 - auto] (default: -1)", MCA_BASE_VAR_TYPE_INT,
NULL, 0, MCA_BASE_VAR_FLAG_SETTABLE,
OPAL_INFO_LVL_3,
OPAL_INFO_LVL_4,
MCA_BASE_VAR_SCOPE_ALL_EQ,
&mca_sshmem_sysv_component.use_hp);

Просмотреть файл

@ -188,8 +188,8 @@ segment_create(map_segment_t *ds_buf,
*/
flags = IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR;
#if defined (SHM_HUGETLB)
flags |= (mca_sshmem_sysv_component.use_hp ? SHM_HUGETLB : 0);
size = ((size + oshmem_gethugepagesize() - 1) / oshmem_gethugepagesize()) * oshmem_gethugepagesize();
flags |= ((0 != mca_sshmem_sysv_component.use_hp) ? SHM_HUGETLB : 0);
size = ((size + sshmem_sysv_gethugepagesize() - 1) / sshmem_sysv_gethugepagesize()) * sshmem_sysv_gethugepagesize();
#endif
/* Create a new shared memory segment and save the shmid. */
@ -295,7 +295,7 @@ segment_detach(map_segment_t *ds_buf, sshmem_mkey_t *mkey)
shmctl(ds_buf->seg_id, IPC_RMID, NULL );
}
if (mca_sshmem_sysv_component.use_hp > 0) {
if (mca_sshmem_sysv_component.use_hp != 0) {
/**
* Workaround kernel panic when detaching huge pages from user space simultanously from several processes
* dont detach here instead let kernel do it during process cleanup
@ -337,3 +337,36 @@ segment_unlink(map_segment_t *ds_buf)
return OSHMEM_SUCCESS;
}
/*
* Get current huge page size
*
*/
size_t sshmem_sysv_gethugepagesize(void)
{
static size_t huge_page_size = 0;
char buf[256];
int size_kb;
FILE *f;
/* Cache the huge page size value */
if (huge_page_size == 0) {
f = fopen("/proc/meminfo", "r");
if (f != NULL) {
while (fgets(buf, sizeof(buf), f)) {
if (sscanf(buf, "Hugepagesize: %d kB", &size_kb) == 1) {
huge_page_size = size_kb * 1024L;
break;
}
}
fclose(f);
}
if (huge_page_size == 0) {
huge_page_size = 2 * 1024L *1024L;
}
}
return huge_page_size;
}

Просмотреть файл

@ -312,12 +312,12 @@ verbs_register(void)
MCA_BASE_VAR_SYN_FLAG_DEPRECATED);
}
mca_sshmem_verbs_component.has_shared_mr = 2;
mca_sshmem_verbs_component.has_shared_mr = -1;
index = mca_base_component_var_register (&mca_sshmem_verbs_component.super.base_version,
"shared_mr", "Shared memory region usage "
"[0 - off, 1 - on, 2 - auto] (default: 2)", MCA_BASE_VAR_TYPE_INT,
"[0 - off, 1 - on, -1 - auto] (default: -1)", MCA_BASE_VAR_TYPE_INT,
NULL, 0, MCA_BASE_VAR_FLAG_SETTABLE,
OPAL_INFO_LVL_3,
OPAL_INFO_LVL_4,
MCA_BASE_VAR_SCOPE_ALL_EQ,
&mca_sshmem_verbs_component.has_shared_mr);