mcexec: --enable-hfi1 to runtime enable/disable HFI1 driver

Conflicts:
	executer/user/mcexec.c
This commit is contained in:
Balazs Gerofi
2017-08-24 23:01:27 +09:00
parent 70238982c2
commit 122588bc4d
6 changed files with 22 additions and 1 deletions

View File

@@ -110,6 +110,8 @@ typedef unsigned long __cpu_set_unit;
#define MPOL_NO_BSS 0x04 #define MPOL_NO_BSS 0x04
#define MPOL_SHM_PREMAP 0x08 #define MPOL_SHM_PREMAP 0x08
#define MCEXEC_HFI1 0x01
struct program_load_desc { struct program_load_desc {
int num_sections; int num_sections;
int status; int status;
@@ -138,6 +140,7 @@ struct program_load_desc {
unsigned long envs_len; unsigned long envs_len;
struct rlimit rlimit[MCK_RLIM_MAX]; struct rlimit rlimit[MCK_RLIM_MAX];
unsigned long interp_align; unsigned long interp_align;
unsigned long mcexec_flags;
unsigned long mpol_flags; unsigned long mpol_flags;
unsigned long mpol_threshold; unsigned long mpol_threshold;
unsigned long heap_extension; unsigned long heap_extension;

View File

@@ -221,6 +221,7 @@ static int mpol_no_stack = 0;
static int mpol_no_bss = 0; static int mpol_no_bss = 0;
static int mpol_shm_premap = 0; static int mpol_shm_premap = 0;
static int no_bind_ikc_map = 0; static int no_bind_ikc_map = 0;
static int hfi1_enabled = 0;
static unsigned long mpol_threshold = 0; static unsigned long mpol_threshold = 0;
static unsigned long heap_extension = (4*1024); static unsigned long heap_extension = (4*1024);
static int profile = 0; static int profile = 0;
@@ -1753,6 +1754,12 @@ static struct option mcexec_options[] = {
.flag = &disable_sched_yield, .flag = &disable_sched_yield,
.val = 1, .val = 1,
}, },
{
.name = "enable-hfi1",
.has_arg = no_argument,
.flag = &hfi1_enabled,
.val = 1,
},
{ {
.name = "extend-heap-by", .name = "extend-heap-by",
.has_arg = required_argument, .has_arg = required_argument,
@@ -2535,6 +2542,11 @@ int main(int argc, char **argv)
} }
} }
desc->mcexec_flags = 0;
if (hfi1_enabled) {
desc->mcexec_flags |= MCEXEC_HFI1;
}
if (ioctl(fd, MCEXEC_UP_PREPARE_IMAGE, (unsigned long)desc) != 0) { if (ioctl(fd, MCEXEC_UP_PREPARE_IMAGE, (unsigned long)desc) != 0) {
perror("prepare"); perror("prepare");
close(fd); close(fd);

View File

@@ -479,6 +479,7 @@ static int process_msg_prepare_process(unsigned long rphys)
proc->sgid = pn->cred[6]; proc->sgid = pn->cred[6];
proc->fsgid = pn->cred[7]; proc->fsgid = pn->cred[7];
proc->termsig = SIGCHLD; proc->termsig = SIGCHLD;
proc->mcexec_flags = pn->mcexec_flags;
proc->mpol_flags = pn->mpol_flags; proc->mpol_flags = pn->mpol_flags;
proc->mpol_threshold = pn->mpol_threshold; proc->mpol_threshold = pn->mpol_threshold;
proc->nr_processes = pn->nr_processes; proc->nr_processes = pn->nr_processes;

View File

@@ -552,6 +552,7 @@ struct process {
long maxrss; long maxrss;
long maxrss_children; long maxrss_children;
unsigned long mcexec_flags;
/* Memory policy flags and memory specific options */ /* Memory policy flags and memory specific options */
unsigned long mpol_flags; unsigned long mpol_flags;
size_t mpol_threshold; size_t mpol_threshold;

View File

@@ -166,6 +166,8 @@ typedef unsigned long __cpu_set_unit;
#define MPOL_NO_BSS 0x04 #define MPOL_NO_BSS 0x04
#define MPOL_SHM_PREMAP 0x08 #define MPOL_SHM_PREMAP 0x08
#define MCEXEC_HFI1 0x01
struct program_load_desc { struct program_load_desc {
int num_sections; int num_sections;
int status; int status;
@@ -194,6 +196,7 @@ struct program_load_desc {
unsigned long envs_len; unsigned long envs_len;
struct rlimit rlimit[MCK_RLIM_MAX]; struct rlimit rlimit[MCK_RLIM_MAX];
unsigned long interp_align; unsigned long interp_align;
unsigned long mcexec_flags;
unsigned long mpol_flags; unsigned long mpol_flags;
unsigned long mpol_threshold; unsigned long mpol_threshold;
unsigned long heap_extension; unsigned long heap_extension;

View File

@@ -481,7 +481,8 @@ long do_syscall(struct syscall_request *req, int cpu, int pid)
#endif // PROFILE_ENABLE #endif // PROFILE_ENABLE
if (req->number == __NR_open && rc > 0) { if (req->number == __NR_open && rc > 0) {
if (res.private_data && if ((cpu_local_var(current)->proc->mcexec_flags & MCEXEC_HFI1) &&
res.private_data &&
!strncmp((const char *)req->args[0], "/dev/hfi", 8)) { !strncmp((const char *)req->args[0], "/dev/hfi", 8)) {
extern void hfi1_txreq_prealloc(void); extern void hfi1_txreq_prealloc(void);