Commit 92b39388 authored by Jack Steiner's avatar Jack Steiner Committed by Linus Torvalds

gru: generic infrastructure for context options

Change the user GRU request for specifying the "task_slice" option to use
a generic infrastructure that can be expanded in the future to include
additional context options.  No new capabilities are added with this
patch.
Signed-off-by: default avatarJack Steiner <steiner@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9f250114
...@@ -749,18 +749,30 @@ long gru_get_gseg_statistics(unsigned long arg) ...@@ -749,18 +749,30 @@ long gru_get_gseg_statistics(unsigned long arg)
* Register the current task as the user of the GSEG slice. * Register the current task as the user of the GSEG slice.
* Needed for TLB fault interrupt targeting. * Needed for TLB fault interrupt targeting.
*/ */
int gru_set_task_slice(long address) int gru_set_context_option(unsigned long arg)
{ {
struct gru_thread_state *gts; struct gru_thread_state *gts;
struct gru_set_context_option_req req;
int ret = 0;
STAT(set_task_slice); STAT(set_context_option);
gru_dbg(grudev, "address 0x%lx\n", address); if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
gts = gru_alloc_locked_gts(address); return -EFAULT;
gru_dbg(grudev, "op %d, gseg 0x%lx, value1 0x%lx\n", req.op, req.gseg, req.val1);
gts = gru_alloc_locked_gts(req.gseg);
if (!gts) if (!gts)
return -EINVAL; return -EINVAL;
gts->ts_tgid_owner = current->tgid; switch (req.op) {
case sco_gseg_owner:
/* Register the current task as the GSEG owner */
gts->ts_tgid_owner = current->tgid;
break;
default:
ret = -EINVAL;
}
gru_unlock_gts(gts); gru_unlock_gts(gts);
return 0; return ret;
} }
...@@ -198,8 +198,8 @@ static long gru_file_unlocked_ioctl(struct file *file, unsigned int req, ...@@ -198,8 +198,8 @@ static long gru_file_unlocked_ioctl(struct file *file, unsigned int req,
case GRU_CREATE_CONTEXT: case GRU_CREATE_CONTEXT:
err = gru_create_new_context(arg); err = gru_create_new_context(arg);
break; break;
case GRU_SET_TASK_SLICE: case GRU_SET_CONTEXT_OPTION:
err = gru_set_task_slice(arg); err = gru_set_context_option(arg);
break; break;
case GRU_USER_GET_EXCEPTION_DETAIL: case GRU_USER_GET_EXCEPTION_DETAIL:
err = gru_get_exception_detail(arg); err = gru_get_exception_detail(arg);
......
...@@ -32,8 +32,8 @@ ...@@ -32,8 +32,8 @@
/* Set Number of Request Blocks */ /* Set Number of Request Blocks */
#define GRU_CREATE_CONTEXT _IOWR(GRU_IOCTL_NUM, 1, void *) #define GRU_CREATE_CONTEXT _IOWR(GRU_IOCTL_NUM, 1, void *)
/* Register task as using the slice */ /* Set Context Options */
#define GRU_SET_TASK_SLICE _IOWR(GRU_IOCTL_NUM, 5, void *) #define GRU_SET_CONTEXT_OPTION _IOWR(GRU_IOCTL_NUM, 4, void *)
/* Fetch exception detail */ /* Fetch exception detail */
#define GRU_USER_GET_EXCEPTION_DETAIL _IOWR(GRU_IOCTL_NUM, 6, void *) #define GRU_USER_GET_EXCEPTION_DETAIL _IOWR(GRU_IOCTL_NUM, 6, void *)
...@@ -95,6 +95,16 @@ struct gru_unload_context_req { ...@@ -95,6 +95,16 @@ struct gru_unload_context_req {
unsigned long gseg; unsigned long gseg;
}; };
/*
* Structure used to set context options
*/
enum {sco_gseg_owner};
struct gru_set_context_option_req {
unsigned long gseg;
int op;
unsigned long val1;
};
/* /*
* Structure used to pass TLB flush parameters to the driver * Structure used to pass TLB flush parameters to the driver
*/ */
......
...@@ -73,7 +73,7 @@ static int statistics_show(struct seq_file *s, void *p) ...@@ -73,7 +73,7 @@ static int statistics_show(struct seq_file *s, void *p)
printstat(s, user_flush_tlb); printstat(s, user_flush_tlb);
printstat(s, user_unload_context); printstat(s, user_unload_context);
printstat(s, user_exception); printstat(s, user_exception);
printstat(s, set_task_slice); printstat(s, set_context_option);
printstat(s, migrate_check); printstat(s, migrate_check);
printstat(s, migrated_retarget); printstat(s, migrated_retarget);
printstat(s, migrated_unload); printstat(s, migrated_unload);
......
...@@ -198,7 +198,7 @@ struct gru_stats_s { ...@@ -198,7 +198,7 @@ struct gru_stats_s {
atomic_long_t user_flush_tlb; atomic_long_t user_flush_tlb;
atomic_long_t user_unload_context; atomic_long_t user_unload_context;
atomic_long_t user_exception; atomic_long_t user_exception;
atomic_long_t set_task_slice; atomic_long_t set_context_option;
atomic_long_t migrate_check; atomic_long_t migrate_check;
atomic_long_t migrated_retarget; atomic_long_t migrated_retarget;
atomic_long_t migrated_unload; atomic_long_t migrated_unload;
...@@ -649,7 +649,7 @@ extern int gru_handle_user_call_os(unsigned long address); ...@@ -649,7 +649,7 @@ extern int gru_handle_user_call_os(unsigned long address);
extern int gru_user_flush_tlb(unsigned long arg); extern int gru_user_flush_tlb(unsigned long arg);
extern int gru_user_unload_context(unsigned long arg); extern int gru_user_unload_context(unsigned long arg);
extern int gru_get_exception_detail(unsigned long arg); extern int gru_get_exception_detail(unsigned long arg);
extern int gru_set_task_slice(long address); extern int gru_set_context_option(unsigned long address);
extern int gru_cpu_fault_map_id(void); extern int gru_cpu_fault_map_id(void);
extern struct vm_area_struct *gru_find_vma(unsigned long vaddr); extern struct vm_area_struct *gru_find_vma(unsigned long vaddr);
extern void gru_flush_all_tlb(struct gru_state *gru); extern void gru_flush_all_tlb(struct gru_state *gru);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment