summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--libgmem.spec55
-rw-r--r--sources2
-rw-r--r--use-ioctl-instead-of-syscall.patch318
4 files changed, 341 insertions, 35 deletions
diff --git a/.gitignore b/.gitignore
index 726ac0a..9e5659a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/libgmem-1.0.tar.gz
+/libgmem-v0.1.tar.gz
diff --git a/libgmem.spec b/libgmem.spec
index fe34cf9..ea4c38a 100644
--- a/libgmem.spec
+++ b/libgmem.spec
@@ -1,16 +1,15 @@
Name: libgmem
-Version: 1.0
-Release: 1
+Version: 0.1
+Release: 2
Summary: Library of Generalized Memory Management
License: MulanPSL-2.0
URL: https://gitee.com/openeuler/libgmem
-Source0: https://github.com/GMEM-Team/libgmem/%{name}-%{version}.tar.gz
+Source0: https://gitee.com/openeuler/libgmem/repository/archive/%{name}-v%{version}.tar.gz
+
+PATCH0001: use-ioctl-instead-of-syscall.patch
BuildRequires: autoconf automake libtool
BuildRequires: gcc glibc-devel make
-#BuildRequires: Ascend-cann-toolkit
-
-Requires: autoconf automake libtool gcc glibc-devel make
%description
libgmem is the abstract layer of GMEM(Generalized Memory Management) user-mode interface,
@@ -21,45 +20,33 @@ Summary: Header files for libgmem development
Requires: %{name} = %{version}-%{release}
%description devel
-The kmod-devel package provides header files used for loading or unloading
-kernel modules.
+The libgmem-devel package provides header files used for GMEM.
%prep
-%autosetup -p1 -n %{name}-%{version}
+%autosetup -p1 -n %{name}-v%{version}
-%install
-#%make_install
-mkdir -p $RPM_BUILD_ROOT%{_includedir}/
-mkdir -p $RPM_BUILD_ROOT%{_usrsrc}/
+%build
+sh ./autogen.sh
+%configure --with-device=Ascend
+%make_build
-install -m 0644 include/libgmem.h $RPM_BUILD_ROOT%{_includedir}/
-cp -r * $RPM_BUILD_ROOT%{_usrsrc}/
+%install
+%make_install
%delete_la
+%ldconfig_scriptlets
+
%files
-#%{_libdir}/%{name}.so.*
-%{_usrsrc}/*
+%license License
+%{_libdir}/%{name}.so*
%files devel
-#%{_libdir}/%{name}.so
%{_includedir}/libgmem.h
-%post
-cd %{_usrsrc}/
-sh ./autogen.sh
-./configure --with-device=Ascend
-make V=1
-make install
-/sbin/ldconfig
-cd -
-
-%postun
-cd %{_usrsrc}/
-make uninstall
-/sbin/ldconfig
-cd -
-
%changelog
-* Sun Aug 13 2023 Yang Yanchao <yangyanchao6@huawei.com> - 1.0-1
+* Tue Aug 29 2023 Yang Yanchao <yangyanchao6@huawei.com> - 0.1-2
+- use ioctl instead of syscall
+
+* Sun Aug 13 2023 Yang Yanchao <yangyanchao6@huawei.com> - 0.1-1
- Init Package
diff --git a/sources b/sources
index 9c16e67..1599a02 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-1d39f493d734f9a8b06fcb3802797498 libgmem-1.0.tar.gz
+8a243961c2f7c31b4202c726472b505c libgmem-v0.1.tar.gz
diff --git a/use-ioctl-instead-of-syscall.patch b/use-ioctl-instead-of-syscall.patch
new file mode 100644
index 0000000..5ee43f5
--- /dev/null
+++ b/use-ioctl-instead-of-syscall.patch
@@ -0,0 +1,318 @@
+From 762c6c0c4c8618fc95aa25696345e369681d0465 Mon Sep 17 00:00:00 2001
+From: Yang Yanchao <yangyanchao6@huawei.com>
+Date: Fri, 25 Aug 2023 18:39:54 +0800
+Subject: [PATCH] use ioctl instead of syscall
+
+---
+ Makefile.am | 3 ++-
+ include/gmem_common.h | 16 ++++++------
+ include/libgmem.h | 24 +++++++++++------
+ src/ascend/gmem_ascend.c | 22 ++++------------
+ src/ascend/gmem_ascend.h | 35 -------------------------
+ src/init.c | 56 ++++++++++++++++++++++++++++++++++++++++
+ src/libgmem.c | 18 +++++++------
+ 7 files changed, 97 insertions(+), 77 deletions(-)
+ delete mode 100644 src/ascend/gmem_ascend.h
+ create mode 100644 src/init.c
+
+diff --git a/Makefile.am b/Makefile.am
+index e18c2fc..06b1435 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -23,7 +23,8 @@ include_HEADERS = include/libgmem.h
+ lib_LTLIBRARIES = libgmem.la
+
+ libgmem_la_SOURCES = \
+- src/libgmem.c
++ src/libgmem.c \
++ src/init.c
+
+ libgmem_la_CFLAGS = $(AM_CFLAGS) \
+ -I$(top_srcdir)/include
+diff --git a/include/gmem_common.h b/include/gmem_common.h
+index 994f953..a400b37 100644
+--- a/include/gmem_common.h
++++ b/include/gmem_common.h
+@@ -13,22 +13,22 @@
+ #ifndef _GMEM_WAPPER_H_
+ #define _GMEM_WAPPER_H_
+
++#include <libgmem.h>
+ #include <stdlib.h>
+
+-struct gm_msg {
+- int behavior;
+- unsigned long addr;
+- size_t size;
+- int hnid;
+-};
+-typedef struct gm_msg *gm_msg_t;
+-
+ typedef struct {
+ int (*FreeEager)(void *userData, void *stream);
+ int (*Prefetch)(void *userData, void *stream);
+ int (*GetNumaId)(void);
+ } gmem_semantics;
+ extern gmem_semantics gmemSemantics;
++extern int gmem_fd;
++
++typedef struct hmadvise_arg gm_msg;
++typedef gm_msg *gm_msg_t;
++
++void init_device(void);
++void destory_device(void);
+
+ int gmemAdvise(void *userData);
+ #endif
+diff --git a/include/libgmem.h b/include/libgmem.h
+index ea313a3..4cd918b 100644
+--- a/include/libgmem.h
++++ b/include/libgmem.h
+@@ -20,14 +20,22 @@ __BEGIN_DECLS
+ /*
+ * TODO: Remove these "ifndef" after kernel upgrade
+ */
+-/*
+- * __NR_madvise 441
+- */
+-#ifndef SYS_hmdvise
+-# ifndef __NR_hmadvise
+-# define __NR_hmadvise 441
+-# endif
+-# define SYS_hmadvise __NR_hmadvise
++#include <sys/ioctl.h>
++struct hmadvise_arg {
++ int hnid;
++ unsigned long start;
++ size_t len_in;
++ int behavior;
++};
++struct gmem_hnid_arg {
++ int *hnuma_id;
++};
++#ifndef GMEM_GET_HNUMA_ID
++ #define GMEM_GET_HNUMA_ID _IOW(0x55, 1, struct gmem_hnid_arg)
++#endif
++
++#ifndef GMEM_MADVISE
++ #define GMEM_MADVISE _IOW(0x55, 2, struct hmadvise_arg)
+ #endif
+
+ #ifndef MADV_PREFETCH
+diff --git a/src/ascend/gmem_ascend.c b/src/ascend/gmem_ascend.c
+index be54813..6181c07 100644
+--- a/src/ascend/gmem_ascend.c
++++ b/src/ascend/gmem_ascend.c
+@@ -19,13 +19,8 @@
+
+ #include <gmem_common.h>
+
+-#include "gmem_ascend.h"
+-
+ #define LIB_ASCENDCL_PATH "/usr/local/Ascend/ascend-toolkit/latest/aarch64-linux/lib64/libascendcl.so"
+
+-void init_gmemSemantics(void) __attribute__ ((constructor));
+-void exit_gmemSemantics(void) __attribute__ ((destructor));
+-
+ typedef void (*Callback_fn)(void *userData);
+ typedef int (*ACLRT_LAUNCH_CB_FUNC)(Callback_fn fn, void *userData, int vlockType, void *stream);
+ ACLRT_LAUNCH_CB_FUNC aclrtLaunchCallback_fn;
+@@ -43,26 +38,19 @@ int ascend_prefech(void *userData, void *stream)
+
+ int ascend_numaid(void)
+ {
+- int ret, id, fd;
+- struct rpg_hnid_arg arg;
+-
+- fd = open("/dev/remote_pager", O_RDWR);
+- if (fd == -1) {
+- perror("Get davinci_manager fd failed");
+- return -ENXIO;
+- }
++ int ret, id;
++ struct gmem_hnid_arg arg;
+
+ arg.hnuma_id = &id;
+- ret = ioctl(fd, RPG_GET_HNUMA_ID, &arg);
++ ret = ioctl(gmem_fd, GMEM_GET_HNUMA_ID, &arg);
+ if (ret < 0) {
+ perror("Get hnuma id ioctl failed.");
+ return ret;
+ }
+- close(fd);
+ return id;
+ }
+
+-void init_gmemSemantics()
++void init_device()
+ {
+ handle = dlopen(LIB_ASCENDCL_PATH, RTLD_LAZY);
+ if (!handle) {
+@@ -76,7 +64,7 @@ void init_gmemSemantics()
+ gmemSemantics.GetNumaId = ascend_numaid;
+ }
+
+-void exit_gmemSemantics()
++void destory_device()
+ {
+ dlclose(handle);
+ }
+diff --git a/src/ascend/gmem_ascend.h b/src/ascend/gmem_ascend.h
+deleted file mode 100644
+index 5348c2e..0000000
+--- a/src/ascend/gmem_ascend.h
++++ /dev/null
+@@ -1,35 +0,0 @@
+-/*
+- * Copyright (c) 2023 yangyanchao6@huawei.com 
+- * libgmem is licensed under Mulan PSL v2.
+- * You can use this software according to the terms and conditions of the Mulan PSL v2.
+- * You may obtain a copy of Mulan PSL v2 at:
+- *          http://license.coscl.org.cn/MulanPSL2
+- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+- * See the Mulan PSL v2 for more details.
+- */
+-
+-#ifndef _GMEM_ASCEND_H_
+-#define _GMEM_ASCEND_H_
+-
+-/*
+- * These definitions should be placed in the kernel,
+- * which is a temporary implementation here.
+- */
+-
+-#define RPG_MAGIC 0x55
+-
+-enum _RPG_IOCTL_CMD {
+- _RPG_GET_HNUMA_ID = 1,
+- _RPG_IOC_MAX_NR
+-};
+-
+-struct rpg_hnid_arg {
+- int *hnuma_id;
+-};
+-
+-#define RPG_GET_HNUMA_ID \
+- _IOW(RPG_MAGIC, _RPG_GET_HNUMA_ID, struct rpg_hnid_arg)
+-
+-#endif
+diff --git a/src/init.c b/src/init.c
+new file mode 100644
+index 0000000..08b2800
+--- /dev/null
++++ b/src/init.c
+@@ -0,0 +1,56 @@
++/*
++ * Copyright (c) 2023 yangyanchao6@huawei.com 
++ * libgmem is licensed under Mulan PSL v2.
++ * You can use this software according to the terms and conditions of the Mulan PSL v2.
++ * You may obtain a copy of Mulan PSL v2 at:
++ *          http://license.coscl.org.cn/MulanPSL2
++ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
++ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
++ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
++ * See the Mulan PSL v2 for more details.
++ */
++
++#include <errno.h>
++#include <linux/mman.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <fcntl.h>
++
++#include <libgmem.h>
++#include <gmem_common.h>
++
++int gmem_fd;
++
++int init_libgmem(void) __attribute__ ((constructor));
++void exit_libgmem(void) __attribute__ ((destructor));
++
++int get_gmem_fd()
++{
++ gmem_fd = open("/dev/gmem", O_RDWR);
++ if (gmem_fd == -1) {
++ perror("Get gmem fd failed");
++ return -ENXIO;
++ }
++ return 0;
++}
++
++void release_gmem_fd()
++{
++ close(gmem_fd);
++}
++
++int init_libgmem(void)
++{
++ if (get_gmem_fd()) {
++ return -ENXIO;
++ }
++ init_device();
++ return 0;
++}
++
++void exit_libgmem(void)
++{
++ release_gmem_fd();
++ destory_device();
++}
++
+diff --git a/src/libgmem.c b/src/libgmem.c
+index a1a1640..9a34de0 100644
+--- a/src/libgmem.c
++++ b/src/libgmem.c
+@@ -23,17 +23,19 @@ gmem_semantics gmemSemantics;
+ static void mix_userData(gm_msg_t userData, unsigned long addr, size_t length, int hnid, int behavior)
+ {
+ userData->behavior = behavior;
+- userData->addr = addr;
+- userData->size = length;
++ userData->start = addr;
++ userData->len_in = length;
+ userData->hnid = hnid;
+ }
+
+ int gmemAdvise(void *userData)
+ {
+- gm_msg_t msg = (gm_msg_t)userData;
+- int ret = syscall(SYS_hmadvise, msg->hnid, msg->addr, msg->size, msg->behavior);
++ int ret;
++ gm_msg msg = *(gm_msg_t)userData;
++
++ ret = ioctl(gmem_fd, GMEM_MADVISE, msg);
+ if(ret) {
+- printf("hmadvise failed: addr:%lx, size:%lx, behavior:%d, hnid:%d\n", msg->addr, msg->size, msg->behavior, msg->hnid);
++ printf("hmadvise failed: addr:%lx, size:%lx, behavior:%d, hnid:%d\n", msg.start, msg.len_in, msg.behavior, msg.hnid);
+ }
+ return ret;
+ }
+@@ -41,7 +43,7 @@ int gmemAdvise(void *userData)
+ int gmemFreeEager(unsigned long addr, size_t length, void *stream)
+ {
+ int ret = -1;
+- gm_msg_t userData = (gm_msg_t)malloc(sizeof(struct gm_msg));
++ gm_msg_t userData = (gm_msg_t)malloc(sizeof(gm_msg));
+ mix_userData(userData, addr, length, -1, MADV_DONTNEED);
+ if (!stream) {
+ ret = gmemAdvise(userData);
+@@ -55,12 +57,12 @@ int gmemFreeEager(unsigned long addr, size_t length, void *stream)
+ int gmemPrefetch(unsigned long addr, size_t length, void *stream)
+ {
+ int ret = -1;
+- gm_msg_t userData = (gm_msg_t)malloc(sizeof(struct gm_msg));
++ gm_msg_t userData = (gm_msg_t)malloc(sizeof(gm_msg));
+ mix_userData(userData, addr, length, gmemGetNumaId(), MADV_PREFETCH);
+ if (!stream) {
+ ret = gmemAdvise(userData);
+ } else if(gmemSemantics.Prefetch != NULL) {
+- ret = gmemSemantics.FreeEager(userData,stream);
++ ret = gmemSemantics.Prefetch(userData, stream);
+ }
+ free(userData);
+ return ret;
+--
+2.41.0.windows.3
+