support McKernel's sysfs tree
This commit is contained in:
@ -9,7 +9,7 @@ obj-m += mcctrl.o
|
||||
|
||||
ccflags-y := -I$(IHK_BASE)/linux/include -I$(IHK_BASE)/ikc/include -I$(IHK_BASE)/include -I$(src)/../../include -mcmodel=kernel -mno-red-zone -DMCEXEC_PATH=\"$(BINDIR)/mcexec\"
|
||||
|
||||
mcctrl-y := driver.o control.o ikc.o syscall.o procfs.o binfmt_mcexec.o
|
||||
mcctrl-y := driver.o control.o ikc.o syscall.o procfs.o binfmt_mcexec.o sysfs.o
|
||||
|
||||
KBUILD_EXTRA_SYMBOLS = @abs_builddir@/../../../../ihk/linux/core/Module.symvers
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include "mcctrl.h"
|
||||
|
||||
#define OS_MAX_MINOR 64
|
||||
@ -137,6 +138,7 @@ static void __exit mcctrl_exit(void)
|
||||
printk("mcctrl: unregistered.\n");
|
||||
for(i = 0; i < OS_MAX_MINOR; i++){
|
||||
if(os[i]){
|
||||
sysfsm_cleanup(os[i]);
|
||||
ihk_os_unregister_user_call_handlers(os[i], mcctrl_uc + i);
|
||||
destroy_ikc_channels(os[i]);
|
||||
procfs_exit(i);
|
||||
|
||||
@ -84,6 +84,26 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
||||
case SCD_MSG_SEND_SIGNAL:
|
||||
sig_done(pisp->arg, pisp->err);
|
||||
break;
|
||||
|
||||
case SCD_MSG_SYSFS_REQ_CREATE:
|
||||
case SCD_MSG_SYSFS_REQ_MKDIR:
|
||||
case SCD_MSG_SYSFS_REQ_SYMLINK:
|
||||
case SCD_MSG_SYSFS_REQ_LOOKUP:
|
||||
case SCD_MSG_SYSFS_REQ_UNLINK:
|
||||
case SCD_MSG_SYSFS_REQ_SETUP:
|
||||
case SCD_MSG_SYSFS_RESP_SHOW:
|
||||
case SCD_MSG_SYSFS_RESP_STORE:
|
||||
case SCD_MSG_SYSFS_RESP_RELEASE:
|
||||
sysfsm_packet_handler(__os, pisp->msg, pisp->err,
|
||||
pisp->sysfs_arg1, pisp->sysfs_arg2);
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "mcctrl:syscall_packet_handler:"
|
||||
"unknown message (%d.%d.%d.%d.%d.%#lx)\n",
|
||||
pisp->msg, pisp->ref, pisp->osnum, pisp->pid,
|
||||
pisp->err, pisp->arg);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -33,10 +33,12 @@
|
||||
#define HEADER_MCCTRL_H
|
||||
|
||||
#include <ihk/ihk_host_driver.h>
|
||||
#include <linux/resource.h>
|
||||
#include <uprotocol.h>
|
||||
#include <linux/wait.h>
|
||||
#include <ihk/ikc.h>
|
||||
#include <ikc/master.h>
|
||||
#include <linux/semaphore.h>
|
||||
|
||||
#define SCD_MSG_PREPARE_PROCESS 0x1
|
||||
#define SCD_MSG_PREPARE_PROCESS_ACKED 0x2
|
||||
@ -57,6 +59,27 @@
|
||||
|
||||
#define SCD_MSG_DEBUG_LOG 0x20
|
||||
|
||||
#define SCD_MSG_SYSFS_REQ_CREATE 0x30
|
||||
/* #define SCD_MSG_SYSFS_RESP_CREATE 0x31 */
|
||||
#define SCD_MSG_SYSFS_REQ_MKDIR 0x32
|
||||
/* #define SCD_MSG_SYSFS_RESP_MKDIR 0x33 */
|
||||
#define SCD_MSG_SYSFS_REQ_SYMLINK 0x34
|
||||
/* #define SCD_MSG_SYSFS_RESP_SYMLINK 0x35 */
|
||||
#define SCD_MSG_SYSFS_REQ_LOOKUP 0x36
|
||||
/* #define SCD_MSG_SYSFS_RESP_LOOKUP 0x37 */
|
||||
#define SCD_MSG_SYSFS_REQ_UNLINK 0x38
|
||||
/* #define SCD_MSG_SYSFS_RESP_UNLINK 0x39 */
|
||||
#define SCD_MSG_SYSFS_REQ_SHOW 0x3a
|
||||
#define SCD_MSG_SYSFS_RESP_SHOW 0x3b
|
||||
#define SCD_MSG_SYSFS_REQ_STORE 0x3c
|
||||
#define SCD_MSG_SYSFS_RESP_STORE 0x3d
|
||||
#define SCD_MSG_SYSFS_REQ_RELEASE 0x3e
|
||||
#define SCD_MSG_SYSFS_RESP_RELEASE 0x3f
|
||||
#define SCD_MSG_SYSFS_REQ_SETUP 0x40
|
||||
#define SCD_MSG_SYSFS_RESP_SETUP 0x41
|
||||
/* #define SCD_MSG_SYSFS_REQ_CLEANUP 0x42 */
|
||||
/* #define SCD_MSG_SYSFS_RESP_CLEANUP 0x43 */
|
||||
|
||||
#define DMA_PIN_SHIFT 21
|
||||
|
||||
#define DO_USER_MODE
|
||||
@ -70,11 +93,24 @@ struct coretable {
|
||||
|
||||
struct ikc_scd_packet {
|
||||
int msg;
|
||||
int ref;
|
||||
int osnum;
|
||||
int pid;
|
||||
int err;
|
||||
unsigned long arg;
|
||||
union {
|
||||
/* for traditional SCD_MSG_* */
|
||||
struct {
|
||||
int ref;
|
||||
int osnum;
|
||||
int pid;
|
||||
int padding;
|
||||
unsigned long arg;
|
||||
};
|
||||
|
||||
/* for SCD_MSG_SYSFS_* */
|
||||
struct {
|
||||
long sysfs_arg1;
|
||||
long sysfs_arg2;
|
||||
long sysfs_arg3;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
struct mcctrl_priv {
|
||||
@ -128,6 +164,31 @@ struct mcctrl_per_proc_data {
|
||||
unsigned long rpgtable; /* per process, not per OS */
|
||||
};
|
||||
|
||||
struct sysfsm_req {
|
||||
int busy;
|
||||
int padding;
|
||||
long lresult;
|
||||
wait_queue_head_t wq;
|
||||
};
|
||||
|
||||
struct sysfsm_data {
|
||||
size_t sysfs_bufsize;
|
||||
void *sysfs_buf;
|
||||
long sysfs_buf_rpa;
|
||||
long sysfs_buf_pa;
|
||||
struct kobject *sysfs_kobj;
|
||||
struct sysfsm_node *sysfs_root;
|
||||
struct semaphore sysfs_tree_sem;
|
||||
struct semaphore sysfs_io_sem;
|
||||
struct sysfsm_req sysfs_req;
|
||||
ihk_os_t sysfs_os;
|
||||
};
|
||||
|
||||
static inline int sysfs_inited(struct sysfsm_data *sdp)
|
||||
{
|
||||
return !!(sdp->sysfs_buf);
|
||||
} /* sysfs_inited() */
|
||||
|
||||
struct mcctrl_usrdata {
|
||||
struct ihk_ikc_listen_param listen_param;
|
||||
struct ihk_ikc_listen_param listen_param2;
|
||||
@ -146,6 +207,7 @@ struct mcctrl_usrdata {
|
||||
struct list_head per_proc_list;
|
||||
ihk_spinlock_t per_proc_list_lock;
|
||||
void **keys;
|
||||
struct sysfsm_data sysfsm_data;
|
||||
};
|
||||
|
||||
struct mcctrl_signal {
|
||||
@ -188,4 +250,8 @@ struct procfs_file {
|
||||
char fname[PROCFS_NAME_MAX]; /* procfs filename (request) */
|
||||
};
|
||||
|
||||
/* sysfs.c */
|
||||
void sysfsm_cleanup(ihk_os_t os);
|
||||
void sysfsm_packet_handler(void *os, int msg, int err, long arg1, long arg2);
|
||||
|
||||
#endif
|
||||
|
||||
1634
executer/kernel/mcctrl/sysfs.c
Normal file
1634
executer/kernel/mcctrl/sysfs.c
Normal file
File diff suppressed because it is too large
Load Diff
76
executer/kernel/mcctrl/sysfs_msg.h
Normal file
76
executer/kernel/mcctrl/sysfs_msg.h
Normal file
@ -0,0 +1,76 @@
|
||||
/**
|
||||
* \file sysfs_msg.h
|
||||
* License details are found in the file LICENSE.
|
||||
* \brief
|
||||
* message declarations for sysfs framework
|
||||
* \author Gou Nakamura <go.nakamura.yw@hitachi-solutions.com> \par
|
||||
* Copyright (C) 2015 RIKEN AICS
|
||||
*/
|
||||
/*
|
||||
* HISTORY:
|
||||
*/
|
||||
|
||||
#ifndef MCKERNEL_SYSFS_MSG_H
|
||||
#define MCKERNEL_SYSFS_MSG_H
|
||||
|
||||
#define SYSFS_PATH_MAX 1024
|
||||
|
||||
struct sysfs_req_create_param {
|
||||
int mode;
|
||||
int error;
|
||||
long client_ops;
|
||||
long client_instance;
|
||||
char path[SYSFS_PATH_MAX];
|
||||
int padding;
|
||||
int busy;
|
||||
}; /* struct sysfs_req_create_param */
|
||||
|
||||
struct sysfs_req_mkdir_param {
|
||||
int error;
|
||||
int padding;
|
||||
long handle;
|
||||
char path[SYSFS_PATH_MAX];
|
||||
int padding2;
|
||||
int busy;
|
||||
}; /* struct sysfs_req_mkdir_param */
|
||||
|
||||
struct sysfs_req_symlink_param {
|
||||
int error;
|
||||
int padding;
|
||||
long target;
|
||||
char path[SYSFS_PATH_MAX];
|
||||
int padding2;
|
||||
int busy;
|
||||
}; /* struct sysfs_req_symlink_param */
|
||||
|
||||
struct sysfs_req_lookup_param {
|
||||
int error;
|
||||
int padding;
|
||||
long handle;
|
||||
char path[SYSFS_PATH_MAX];
|
||||
int padding2;
|
||||
int busy;
|
||||
}; /* struct sysfs_req_lookup_param */
|
||||
|
||||
/* for sysfs_req_unlink_param.flags */
|
||||
#define SYSFS_UNLINK_KEEP_ANCESTOR 0x01
|
||||
|
||||
struct sysfs_req_unlink_param {
|
||||
int flags;
|
||||
int error;
|
||||
char path[SYSFS_PATH_MAX];
|
||||
int padding;
|
||||
int busy;
|
||||
}; /* struct sysfs_req_unlink_param */
|
||||
|
||||
struct sysfs_req_setup_param {
|
||||
int error;
|
||||
int padding;
|
||||
long buf_rpa;
|
||||
long bufsize;
|
||||
char padding3[SYSFS_PATH_MAX];
|
||||
int padding2;
|
||||
int busy;
|
||||
}; /* struct sysfs_req_setup_param */
|
||||
|
||||
#endif /* MCKERNEL_SYSFS_MSG_H */
|
||||
Reference in New Issue
Block a user