mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 18:22:00 -04:00
amdkfd: introduce new ioctl AMDKFD_IOC_CREATE_PROCESS
This commit implemetns a new ioctl AMDKFD_IOC_CREATE_PROCESS that creates a new secondary kfd_progress on the FD. To keep backward compatibility, userspace programs need to invoke this ioctl explicitly on a FD to create a secondary kfd_process which replacing its primary kfd_process. This commit bumps ioctl minor version. Signed-off-by: Zhu Lingshan <lingshan.zhu@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
e3491fa3f3
commit
cc6b66d661
@@ -3150,6 +3150,48 @@ static int kfd_ioctl_set_debug_trap(struct file *filep, struct kfd_process *p, v
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* userspace programs need to invoke this ioctl explicitly on a FD to
|
||||||
|
* create a secondary kfd_process which replacing its primary kfd_process
|
||||||
|
*/
|
||||||
|
static int kfd_ioctl_create_process(struct file *filep, struct kfd_process *p, void *data)
|
||||||
|
{
|
||||||
|
struct kfd_process *process;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Each FD owns only one kfd_process */
|
||||||
|
if (p->context_id != KFD_CONTEXT_ID_PRIMARY)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!filep->private_data || !p)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&kfd_processes_mutex);
|
||||||
|
if (p != filep->private_data) {
|
||||||
|
mutex_unlock(&kfd_processes_mutex);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
process = create_process(current, false);
|
||||||
|
if (IS_ERR(process)) {
|
||||||
|
mutex_unlock(&kfd_processes_mutex);
|
||||||
|
return PTR_ERR(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
filep->private_data = process;
|
||||||
|
mutex_unlock(&kfd_processes_mutex);
|
||||||
|
|
||||||
|
ret = kfd_create_process_sysfs(process);
|
||||||
|
if (ret)
|
||||||
|
pr_warn("Failed to create sysfs entry for the kfd_process");
|
||||||
|
|
||||||
|
/* Each open() increases kref of the primary kfd_process,
|
||||||
|
* so we need to reduce it here when we create a new secondary process replacing it
|
||||||
|
*/
|
||||||
|
kfd_unref_process(p);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
|
#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
|
||||||
[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
|
[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
|
||||||
.cmd_drv = 0, .name = #ioctl}
|
.cmd_drv = 0, .name = #ioctl}
|
||||||
@@ -3268,6 +3310,9 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
|
|||||||
|
|
||||||
AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_TRAP,
|
AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_TRAP,
|
||||||
kfd_ioctl_set_debug_trap, 0),
|
kfd_ioctl_set_debug_trap, 0),
|
||||||
|
|
||||||
|
AMDKFD_IOCTL_DEF(AMDKFD_IOC_CREATE_PROCESS,
|
||||||
|
kfd_ioctl_create_process, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
|
#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
|
||||||
|
|||||||
@@ -1053,6 +1053,7 @@ struct amdkfd_ioctl_desc {
|
|||||||
};
|
};
|
||||||
bool kfd_dev_is_large_bar(struct kfd_node *dev);
|
bool kfd_dev_is_large_bar(struct kfd_node *dev);
|
||||||
|
|
||||||
|
struct kfd_process *create_process(const struct task_struct *thread, bool primary);
|
||||||
int kfd_process_create_wq(void);
|
int kfd_process_create_wq(void);
|
||||||
void kfd_process_destroy_wq(void);
|
void kfd_process_destroy_wq(void);
|
||||||
void kfd_cleanup_processes(void);
|
void kfd_cleanup_processes(void);
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ static struct workqueue_struct *kfd_restore_wq;
|
|||||||
static struct kfd_process *find_process(const struct task_struct *thread,
|
static struct kfd_process *find_process(const struct task_struct *thread,
|
||||||
bool ref);
|
bool ref);
|
||||||
static void kfd_process_ref_release(struct kref *ref);
|
static void kfd_process_ref_release(struct kref *ref);
|
||||||
static struct kfd_process *create_process(const struct task_struct *thread, bool primary);
|
|
||||||
|
|
||||||
static void evict_process_worker(struct work_struct *work);
|
static void evict_process_worker(struct work_struct *work);
|
||||||
static void restore_process_worker(struct work_struct *work);
|
static void restore_process_worker(struct work_struct *work);
|
||||||
@@ -1582,7 +1581,7 @@ void kfd_process_set_trap_debug_flag(struct qcm_process_device *qpd,
|
|||||||
* On return the kfd_process is fully operational and will be freed when the
|
* On return the kfd_process is fully operational and will be freed when the
|
||||||
* mm is released
|
* mm is released
|
||||||
*/
|
*/
|
||||||
static struct kfd_process *create_process(const struct task_struct *thread, bool primary)
|
struct kfd_process *create_process(const struct task_struct *thread, bool primary)
|
||||||
{
|
{
|
||||||
struct kfd_process *process;
|
struct kfd_process *process;
|
||||||
struct mmu_notifier *mn;
|
struct mmu_notifier *mn;
|
||||||
|
|||||||
@@ -44,9 +44,10 @@
|
|||||||
* - 1.16 - Add contiguous VRAM allocation flag
|
* - 1.16 - Add contiguous VRAM allocation flag
|
||||||
* - 1.17 - Add SDMA queue creation with target SDMA engine ID
|
* - 1.17 - Add SDMA queue creation with target SDMA engine ID
|
||||||
* - 1.18 - Rename pad in set_memory_policy_args to misc_process_flag
|
* - 1.18 - Rename pad in set_memory_policy_args to misc_process_flag
|
||||||
|
* - 1.19 - Add a new ioctl to craete secondary kfd processes
|
||||||
*/
|
*/
|
||||||
#define KFD_IOCTL_MAJOR_VERSION 1
|
#define KFD_IOCTL_MAJOR_VERSION 1
|
||||||
#define KFD_IOCTL_MINOR_VERSION 18
|
#define KFD_IOCTL_MINOR_VERSION 19
|
||||||
|
|
||||||
struct kfd_ioctl_get_version_args {
|
struct kfd_ioctl_get_version_args {
|
||||||
__u32 major_version; /* from KFD */
|
__u32 major_version; /* from KFD */
|
||||||
@@ -1671,7 +1672,10 @@ struct kfd_ioctl_dbg_trap_args {
|
|||||||
#define AMDKFD_IOC_DBG_TRAP \
|
#define AMDKFD_IOC_DBG_TRAP \
|
||||||
AMDKFD_IOWR(0x26, struct kfd_ioctl_dbg_trap_args)
|
AMDKFD_IOWR(0x26, struct kfd_ioctl_dbg_trap_args)
|
||||||
|
|
||||||
|
#define AMDKFD_IOC_CREATE_PROCESS \
|
||||||
|
AMDKFD_IO(0x27)
|
||||||
|
|
||||||
#define AMDKFD_COMMAND_START 0x01
|
#define AMDKFD_COMMAND_START 0x01
|
||||||
#define AMDKFD_COMMAND_END 0x27
|
#define AMDKFD_COMMAND_END 0x28
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user