Commit 482f0777 authored by Felix Kuehling's avatar Felix Kuehling Committed by Oded Gabbay

drm/amdkfd: Simplify event ID and signal slot management

Signal slots are identical to event IDs.

Replace the used_slot_bitmap and events hash table with an IDR to
allocate and lookup event IDs and signal slots more efficiently.
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Acked-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent 50cb7dd9
This diff is collapsed.
...@@ -31,9 +31,13 @@ ...@@ -31,9 +31,13 @@
#include "kfd_priv.h" #include "kfd_priv.h"
#include <uapi/linux/kfd_ioctl.h> #include <uapi/linux/kfd_ioctl.h>
#define KFD_EVENT_ID_NONSIGNAL_MASK 0x80000000U /*
#define KFD_FIRST_NONSIGNAL_EVENT_ID KFD_EVENT_ID_NONSIGNAL_MASK * IDR supports non-negative integer IDs. Small IDs are used for
#define KFD_LAST_NONSIGNAL_EVENT_ID UINT_MAX * signal events to match their signal slot. Use the upper half of the
* ID space for non-signal events.
*/
#define KFD_FIRST_NONSIGNAL_EVENT_ID ((INT_MAX >> 1) + 1)
#define KFD_LAST_NONSIGNAL_EVENT_ID INT_MAX
/* /*
* Written into kfd_signal_slot_t to indicate that the event is not signaled. * Written into kfd_signal_slot_t to indicate that the event is not signaled.
...@@ -47,9 +51,6 @@ struct kfd_event_waiter; ...@@ -47,9 +51,6 @@ struct kfd_event_waiter;
struct signal_page; struct signal_page;
struct kfd_event { struct kfd_event {
/* All events in process, rooted at kfd_process.events. */
struct hlist_node events;
u32 event_id; u32 event_id;
bool signaled; bool signaled;
...@@ -60,7 +61,6 @@ struct kfd_event { ...@@ -60,7 +61,6 @@ struct kfd_event {
wait_queue_head_t wq; /* List of event waiters. */ wait_queue_head_t wq; /* List of event waiters. */
/* Only for signal events. */ /* Only for signal events. */
unsigned int signal_slot_index;
uint64_t __user *user_signal_address; uint64_t __user *user_signal_address;
/* type specific data */ /* type specific data */
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/kfd_ioctl.h> #include <linux/kfd_ioctl.h>
#include <linux/idr.h>
#include <kgd_kfd_interface.h> #include <kgd_kfd_interface.h>
#include "amd_shared.h" #include "amd_shared.h"
...@@ -538,11 +539,10 @@ struct kfd_process { ...@@ -538,11 +539,10 @@ struct kfd_process {
/* Event-related data */ /* Event-related data */
struct mutex event_mutex; struct mutex event_mutex;
/* All events in process hashed by ID, linked on kfd_event.events. */ /* Event ID allocator and lookup */
DECLARE_HASHTABLE(events, 4); struct idr event_idr;
/* Event page */ /* Event page */
struct kfd_signal_page *signal_page; struct kfd_signal_page *signal_page;
u32 next_nonsignal_event_id;
size_t signal_event_count; size_t signal_event_count;
bool signal_event_limit_reached; bool signal_event_limit_reached;
}; };
......
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