Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+18 −6
Original line number Original line Diff line number Diff line
@@ -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;


	switch (req.op) {
	case sco_gseg_owner:
 		/* Register the current task as the GSEG owner */
		gts->ts_tgid_owner = current->tgid;
		gts->ts_tgid_owner = current->tgid;
		break;
	default:
		ret = -EINVAL;
	}
	gru_unlock_gts(gts);
	gru_unlock_gts(gts);


	return 0;
	return ret;
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -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);
+12 −2
Original line number Original line Diff line number Diff line
@@ -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
 */
 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
+2 −2
Original line number Original line Diff line number Diff line
@@ -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);