On Mon, Jul 25, 2022 at 09:34:14PM +0100, Chris Narkiewicz wrote: > On Mon, Jul 25, 2022 at 03:48:19PM -0400, Nick Holland wrote: > > Sigh. collect info, leave out most basic part: what I mean > > by "X quit working"... > > I checked your Xorg.0.log and it looks familiar. Please look for post > "X11 hangs on StarLabs Mk IV - snapshot 06-06-2022" in the bugs@ > archive and recent discussion in t...@openbsd.org: > "Xorg hanging on StarLabs Lite IV - infinite sleep in ioctl > drm_syncobj_array_wait_timeout"
this reminds me of Xorg being stuck on schto when running the intel xorg driver on recent hardware here is a diff which fixes some llist iterators, which makes the intel xorg driver work on broadwell does this also help these machines? Index: sys/dev/pci/drm/include/linux/irq_work.h =================================================================== RCS file: /cvs/src/sys/dev/pci/drm/include/linux/irq_work.h,v retrieving revision 1.8 diff -u -p -r1.8 irq_work.h --- sys/dev/pci/drm/include/linux/irq_work.h 19 Jan 2022 05:36:54 -0000 1.8 +++ sys/dev/pci/drm/include/linux/irq_work.h 26 Jul 2022 12:24:19 -0000 @@ -22,13 +22,20 @@ #include <sys/systm.h> #include <sys/task.h> +#include <linux/llist.h> + struct workqueue_struct; extern struct workqueue_struct *system_wq; +struct irq_node { + struct llist_node llist; +}; + struct irq_work { struct task task; struct taskq *tq; + struct irq_node node; }; typedef void (*irq_work_func_t)(struct irq_work *); Index: sys/dev/pci/drm/include/linux/llist.h =================================================================== RCS file: /cvs/src/sys/dev/pci/drm/include/linux/llist.h,v retrieving revision 1.2 diff -u -p -r1.2 llist.h --- sys/dev/pci/drm/include/linux/llist.h 8 Jun 2020 04:48:14 -0000 1.2 +++ sys/dev/pci/drm/include/linux/llist.h 26 Jul 2022 12:19:00 -0000 @@ -13,8 +13,7 @@ struct llist_head { struct llist_node *first; }; -#define llist_entry(ptr, type, member) \ - ((ptr) ? container_of(ptr, type, member) : NULL) +#define llist_entry(ptr, type, member) container_of(ptr, type, member) static inline struct llist_node * llist_del_all(struct llist_head *head) @@ -82,13 +81,13 @@ llist_empty(struct llist_head *head) #define llist_for_each_entry_safe(pos, n, node, member) \ for (pos = llist_entry((node), __typeof(*pos), member); \ - pos != NULL && \ + ((char *)(pos) + offsetof(typeof(*(pos)), member)) != NULL && \ (n = llist_entry(pos->member.next, __typeof(*pos), member), pos); \ pos = n) #define llist_for_each_entry(pos, node, member) \ for ((pos) = llist_entry((node), __typeof(*(pos)), member); \ - (pos) != NULL; \ + ((char *)(pos) + offsetof(typeof(*(pos)), member)) != NULL; \ (pos) = llist_entry((pos)->member.next, __typeof(*(pos)), member)) #endif Index: sys/dev/pci/drm/i915/i915_request.c =================================================================== RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_request.c,v retrieving revision 1.10 diff -u -p -r1.10 i915_request.c --- sys/dev/pci/drm/i915/i915_request.c 30 Jan 2022 23:18:20 -0000 1.10 +++ sys/dev/pci/drm/i915/i915_request.c 26 Jul 2022 12:21:38 -0000 @@ -165,7 +165,7 @@ static void irq_execute_cb(struct irq_wo struct execute_cb *cb = container_of(wrk, typeof(*cb), work); i915_sw_fence_complete(cb->fence); -#ifdef notyet +#ifdef __linux__ kmem_cache_free(slab_execute_cbs, cb); #else pool_put(&slab_execute_cbs, cb); @@ -180,13 +180,10 @@ __notify_execute_cb(struct i915_request if (llist_empty(&rq->execute_cb)) return; - STUB(); -#ifdef notyet llist_for_each_entry_safe(cb, cn, llist_del_all(&rq->execute_cb), work.node.llist) fn(&cb->work); -#endif } static void __notify_execute_cb_irq(struct i915_request *rq) @@ -196,10 +193,11 @@ static void __notify_execute_cb_irq(stru static bool irq_work_imm(struct irq_work *wrk) { -#ifdef notyet +#ifdef __linux__ wrk->func(wrk); #else STUB(); + //irq_work_sync(wrk); #endif return false; } @@ -506,11 +504,6 @@ __await_execution(struct i915_request *r if (i915_request_is_active(signal)) return 0; - STUB(); - i915_sw_fence_await(&rq->submit); - return -ENOSYS; -#ifdef notyet - #ifdef __linux__ cb = kmem_cache_alloc(slab_execute_cbs, gfp); #else @@ -544,7 +537,6 @@ __await_execution(struct i915_request *r } return 0; -#endif } static bool fatal_error(int error)