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: Jack Steiner <steiner@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9f2501142b
commit
92b39388ee
5 changed files with 35 additions and 13 deletions
|
@ -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,
|
||||||
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 @@
|
||||||
/* 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 {
|
||||||
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)
|
||||||
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 {
|
||||||
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);
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue