Skip to content

Commit

Permalink
Use the irq_work from D24859
Browse files Browse the repository at this point in the history
Signed-off-by: Emmanuel Vadot <manu@FreeBSD.org>
  • Loading branch information
evadot committed May 19, 2020
1 parent dc56204 commit b1530ea
Show file tree
Hide file tree
Showing 11 changed files with 9 additions and 68 deletions.
10 changes: 1 addition & 9 deletions drivers/gpu/drm/i915/i915_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,14 +357,8 @@ static void __notify_execute_cb(struct i915_request *rq)
if (list_empty(&rq->execute_cb))
return;

list_for_each_entry(cb, &rq->execute_cb, link) {
#ifdef __linux__
list_for_each_entry(cb, &rq->execute_cb, link)
irq_work_queue(&cb->work);
#elif defined(__FreeBSD__)
i915_sw_fence_complete(cb->fence);
kmem_cache_free(global.slab_execute_cbs, cb);
#endif
}

/*
* XXX Rollback on __i915_request_unsubmit()
Expand Down Expand Up @@ -395,9 +389,7 @@ i915_request_await_execution(struct i915_request *rq,

cb->fence = &rq->submit;
i915_sw_fence_await(cb->fence);
#ifdef __freebsd_notyet__
init_irq_work(&cb->work, irq_execute_cb);
#endif

spin_lock_irq(&signal->lock);
if (i915_request_is_active(signal)) {
Expand Down
22 changes: 2 additions & 20 deletions drivers/gpu/drm/i915/i915_sw_fence.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,9 @@

#include <linux/slab.h>
#include <linux/dma-fence.h>
#ifdef __linux
#include <linux/irq_work.h>
#else
#include <linux/workqueue.h>
#endif
#include <linux/reservation.h>

#include "i915_sw_fence.h"
#include "i915_selftest.h"

Expand Down Expand Up @@ -370,11 +367,7 @@ struct i915_sw_dma_fence_cb_timer {
struct i915_sw_dma_fence_cb base;
struct dma_fence *dma;
struct timer_list timer;
#ifdef __linux__
struct irq_work work;
#else
struct work_struct work;
#endif
struct rcu_head rcu;
};

Expand Down Expand Up @@ -416,18 +409,10 @@ static void dma_i915_sw_fence_wake_timer(struct dma_fence *dma,
if (fence)
i915_sw_fence_complete(fence);

#ifdef __linux__
irq_work_queue(&cb->work);
#elif defined(__FreeBSD__)
schedule_work(&cb->work);
#endif
}

#ifdef __linux__
static void irq_i915_sw_fence_work(struct irq_work *wrk)
#else
static void irq_i915_sw_fence_work(struct work_struct *wrk)
#endif
{
struct i915_sw_dma_fence_cb_timer *cb =
container_of(wrk, typeof(*cb), work);
Expand Down Expand Up @@ -473,11 +458,8 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
container_of(cb, typeof(*timer), base);

timer->dma = dma_fence_get(dma);
#ifdef __linux__
init_irq_work(&timer->work, irq_i915_sw_fence_work);
#else
INIT_WORK(&timer->work, irq_i915_sw_fence_work);
#endif

timer_setup(&timer->timer,
timer_i915_sw_fence_wake, TIMER_IRQSAFE);
mod_timer(&timer->timer, round_jiffies_up(jiffies + timeout));
Expand Down
2 changes: 0 additions & 2 deletions drivers/gpu/drm/i915/intel_breadcrumbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,9 +257,7 @@ void intel_engine_init_breadcrumbs(struct intel_engine_cs *engine)
spin_lock_init(&b->irq_lock);
INIT_LIST_HEAD(&b->signalers);

#ifdef __linux__
init_irq_work(&b->irq_work, signal_irq_work);
#endif
}

void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine)
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/i915/intel_engine_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include <linux/types.h>

#ifdef __FreeBSD__
#include <linux/relay.h> /* For struct irq_work */
#include <linux/seqlock.h>
#include <linux/notifier.h> /* for struct atomic_notifier_head */
#endif
Expand Down
Empty file.
4 changes: 0 additions & 4 deletions linuxkpi/gplv2/include/linux/dma-fence-array.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@
#define __LINUX_GPLV2_DMA_FENCE_ARRAY_H

#include <linux/dma-fence.h>
#ifdef __linux__
#include <linux/irq_work.h>
#endif

/**
* struct dma_fence_array_cb - callback helper for fence array
Expand Down Expand Up @@ -44,9 +42,7 @@ struct dma_fence_array {
atomic_t num_pending;
struct dma_fence **fences;

#ifdef __linux__
struct irq_work work;
#endif
};

extern const struct dma_fence_ops dma_fence_array_ops;
Expand Down
2 changes: 0 additions & 2 deletions linuxkpi/gplv2/include/linux/dma-fence-chain.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ struct dma_fence_chain {
u64 prev_seqno;
struct dma_fence *fence;
struct dma_fence_cb cb;
#ifdef __linux__
struct irq_work work;
#endif
};

extern const struct dma_fence_ops dma_fence_chain_ops;
Expand Down
6 changes: 1 addition & 5 deletions linuxkpi/gplv2/include/linux/relay.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <linux/timer.h>
#include <linux/wait.h>
#include <linux/list.h>
/* #include <linux/irq_work.h> */
#include <linux/irq_work.h>
#include <linux/bug.h>
#include <linux/fs.h>
#include <linux/poll.h>
Expand All @@ -23,10 +23,6 @@
// Naive (not per-cpu) relay channel impl


struct irq_work {

};

struct rchan_buf
{
void *start; /* start of channel buffer */
Expand Down
13 changes: 2 additions & 11 deletions linuxkpi/gplv2/src/linux_dma-fence-array.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,13 @@ static const char *dma_fence_array_get_timeline_name(struct dma_fence *fence)
return "unbound";
}

#ifdef __linux__
static void irq_dma_fence_array_work(struct irq_work *wrk)
{
struct dma_fence_array *array = container_of(wrk, typeof(*array), work);

dma_fence_signal(&array->base);
dma_fence_put(&array->base);
}
#endif

static void dma_fence_array_cb_func(struct dma_fence *f,
struct dma_fence_cb *cb)
Expand All @@ -40,14 +38,9 @@ static void dma_fence_array_cb_func(struct dma_fence *f,
container_of(cb, struct dma_fence_array_cb, cb);
struct dma_fence_array *array = array_cb->array;

if (atomic_dec_and_test(&array->num_pending)) {
#ifdef __linux__
if (atomic_dec_and_test(&array->num_pending))
irq_work_queue(&array->work);
#else
dma_fence_signal(&array->base);
dma_fence_put(&array->base);
#endif
} else
else
dma_fence_put(&array->base);
}

Expand Down Expand Up @@ -143,9 +136,7 @@ struct dma_fence_array *dma_fence_array_create(int num_fences,
spin_lock_init(&array->lock);
dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock,
context, seqno);
#ifdef __linux__
init_irq_work(&array->work, irq_dma_fence_array_work);
#endif

array->num_fences = num_fences;
atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
Expand Down
11 changes: 0 additions & 11 deletions linuxkpi/gplv2/src/linux_dma-fence-chain.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ static const char *dma_fence_chain_get_timeline_name(struct dma_fence *fence)
return "unbound";
}

#ifdef __linux__
static void dma_fence_chain_irq_work(struct irq_work *work)
{
struct dma_fence_chain *chain;
Expand All @@ -135,21 +134,13 @@ static void dma_fence_chain_irq_work(struct irq_work *work)
dma_fence_signal(&chain->base);
dma_fence_put(&chain->base);
}
#endif

static void dma_fence_chain_cb(struct dma_fence *f, struct dma_fence_cb *cb)
{
struct dma_fence_chain *chain;

chain = container_of(cb, typeof(*chain), cb);
#ifdef __linux__
irq_work_queue(&chain->work);
#elif defined(__FreeBSD__)
if (!dma_fence_chain_enable_signaling(&chain->base))
/* Ok, we are done. No more unsignaled fences left */
dma_fence_signal(&chain->base);
dma_fence_put(&chain->base);
#endif
dma_fence_put(f);
}

Expand Down Expand Up @@ -228,9 +219,7 @@ void dma_fence_chain_init(struct dma_fence_chain *chain,
rcu_assign_pointer(chain->prev, prev);
chain->fence = fence;
chain->prev_seqno = 0;
#ifdef __linux__
init_irq_work(&chain->work, dma_fence_chain_irq_work);
#endif

/* Try to reuse the context of the previous chain node. */
if (prev_chain && __dma_fence_is_later(seqno, prev->seqno, prev->ops)) {
Expand Down
6 changes: 3 additions & 3 deletions linuxkpi/gplv2/src/linux_relay.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <fs/pseudofs/pseudofs.h>

#include <linux/seq_file.h>
#include <linux/irq_work.h>
#include <linux/relay.h>
#include <linux/slab.h>
#include <linux/poll.h>
Expand All @@ -18,10 +19,9 @@ static DEFINE_MUTEX(relay_channels_mutex);
static LIST_HEAD(relay_channels);

#define irq_work_sync(x)
#define irq_work_queue(x)
#define init_irq_work(x, y)
#define alloc_percpu(x) kmalloc(mp_ncpus*sizeof(x), GFP_KERNEL)

static void wakeup_readers(struct irq_work *work);
/*
Default channel callbacks
*/
Expand Down Expand Up @@ -350,7 +350,7 @@ static void relay_close_buf(struct rchan_buf *buf)
kref_put(&buf->kref, relay_remove_buf);
}

__unused static void wakeup_readers(struct irq_work *work)
static void wakeup_readers(struct irq_work *work)
{
printf("%s\n", __func__);
struct rchan_buf *buf;
Expand Down

0 comments on commit b1530ea

Please sign in to comment.