Module Name: src Committed By: riastradh Date: Sun Dec 19 12:00:49 UTC 2021
Modified Files: src/sys/external/bsd/common/include/linux: slab.h src/sys/external/bsd/drm2/dist/drm/i915: i915_request.c src/sys/external/bsd/drm2/include/linux: dma-fence.h src/sys/external/bsd/drm2/linux: linux_dma_fence.c Log Message: i915: Defer destroying request lock and fence until page destruction. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/common/include/linux/slab.h cvs rdiff -u -r1.8 -r1.9 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c cvs rdiff -u -r1.12 -r1.13 \ src/sys/external/bsd/drm2/include/linux/dma-fence.h cvs rdiff -u -r1.17 -r1.18 src/sys/external/bsd/drm2/linux/linux_dma_fence.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/common/include/linux/slab.h diff -u src/sys/external/bsd/common/include/linux/slab.h:1.6 src/sys/external/bsd/common/include/linux/slab.h:1.7 --- src/sys/external/bsd/common/include/linux/slab.h:1.6 Sun Dec 19 11:58:09 2021 +++ src/sys/external/bsd/common/include/linux/slab.h Sun Dec 19 12:00:48 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: slab.h,v 1.6 2021/12/19 11:58:09 riastradh Exp $ */ +/* $NetBSD: slab.h,v 1.7 2021/12/19 12:00:48 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -137,6 +137,7 @@ struct kmem_cache { pool_cache_t kc_pool_cache; size_t kc_size; void (*kc_ctor)(void *); + void (*kc_dtor)(void *); }; /* XXX These should be in <sys/pool.h>. */ @@ -168,6 +169,15 @@ kmem_cache_ctor(void *cookie, void *ptr, return 0; } +static void +kmem_cache_dtor(void *cookie, void *ptr) +{ + struct kmem_cache *const kc = cookie; + + if (kc->kc_dtor) + (*kc->kc_dtor)(ptr); +} + static inline struct kmem_cache * kmem_cache_create(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *)) @@ -189,6 +199,29 @@ kmem_cache_create(const char *name, size return kc; } +/* XXX extension */ +static inline struct kmem_cache * +kmem_cache_create_dtor(const char *name, size_t size, size_t align, + unsigned long flags, void (*ctor)(void *), void (*dtor)(void *)) +{ + struct pool_allocator *palloc = NULL; + struct kmem_cache *kc; + + if (ISSET(flags, SLAB_HWCACHE_ALIGN)) + align = roundup(MAX(1, align), CACHE_LINE_SIZE); + if (ISSET(flags, SLAB_TYPESAFE_BY_RCU)) + palloc = &pool_allocator_kmem_rcu; + + kc = kmem_alloc(sizeof(*kc), KM_SLEEP); + kc->kc_pool_cache = pool_cache_init(size, align, 0, 0, name, palloc, + IPL_VM, &kmem_cache_ctor, &kmem_cache_dtor, kc); + kc->kc_size = size; + kc->kc_ctor = ctor; + kc->kc_dtor = dtor; + + return kc; +} + #define KMEM_CACHE(T, F) \ kmem_cache_create(#T, sizeof(struct T), __alignof__(struct T), \ (F), NULL) Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.8 src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.9 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.8 Sun Dec 19 12:00:40 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c Sun Dec 19 12:00:48 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_request.c,v 1.8 2021/12/19 12:00:40 riastradh Exp $ */ +/* $NetBSD: i915_request.c,v 1.9 2021/12/19 12:00:48 riastradh Exp $ */ /* * Copyright © 2008-2015 Intel Corporation @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_request.c,v 1.8 2021/12/19 12:00:40 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_request.c,v 1.9 2021/12/19 12:00:48 riastradh Exp $"); #include <linux/dma-fence-array.h> #include <linux/irq_work.h> @@ -121,8 +121,6 @@ static void i915_fence_release(struct dm i915_sw_fence_fini(&rq->submit); i915_sw_fence_fini(&rq->semaphore); - dma_fence_destroy(&rq->fence); - spin_lock_destroy(&rq->lock); kmem_cache_free(global.slab_requests, rq); } @@ -602,9 +600,7 @@ static void __i915_request_ctor(void *ar i915_sw_fence_init(&rq->submit, submit_notify); i915_sw_fence_init(&rq->semaphore, semaphore_notify); -#ifndef __NetBSD__ dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock, 0, 0); -#endif rq->file_priv = NULL; rq->capture_list = NULL; @@ -612,6 +608,14 @@ static void __i915_request_ctor(void *ar INIT_LIST_HEAD(&rq->execute_cb); } +static void __i915_request_dtor(void *arg) +{ + struct i915_request *rq = arg; + + dma_fence_destroy(&rq->fence); + spin_lock_destroy(&rq->lock); +} + struct i915_request * __i915_request_create(struct intel_context *ce, gfp_t gfp) { @@ -671,7 +675,7 @@ __i915_request_create(struct intel_conte rq->execution_mask = ce->engine->mask; #ifdef __NetBSD__ - dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock, 0, 0); + dma_fence_reset(&rq->fence, &i915_fence_ops, &rq->lock, 0, 0); #else kref_init(&rq->fence.refcount); rq->fence.flags = 0; @@ -1677,13 +1681,14 @@ static struct i915_global_request global int __init i915_global_request_init(void) { global.slab_requests = - kmem_cache_create("i915_request", + kmem_cache_create_dtor("i915_request", sizeof(struct i915_request), __alignof__(struct i915_request), SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT | SLAB_TYPESAFE_BY_RCU, - __i915_request_ctor); + __i915_request_ctor, + __i915_request_dtor); if (!global.slab_requests) return -ENOMEM; Index: src/sys/external/bsd/drm2/include/linux/dma-fence.h diff -u src/sys/external/bsd/drm2/include/linux/dma-fence.h:1.12 src/sys/external/bsd/drm2/include/linux/dma-fence.h:1.13 --- src/sys/external/bsd/drm2/include/linux/dma-fence.h:1.12 Sun Dec 19 11:03:57 2021 +++ src/sys/external/bsd/drm2/include/linux/dma-fence.h Sun Dec 19 12:00:48 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: dma-fence.h,v 1.12 2021/12/19 11:03:57 riastradh Exp $ */ +/* $NetBSD: dma-fence.h,v 1.13 2021/12/19 12:00:48 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -102,6 +102,7 @@ struct dma_fence_cb { #define dma_fence_is_signaled_locked linux_dma_fence_is_signaled_locked #define dma_fence_put linux_dma_fence_put #define dma_fence_remove_callback linux_dma_fence_remove_callback +#define dma_fence_reset linux_dma_fence_reset #define dma_fence_set_error linux_dma_fence_set_error #define dma_fence_signal linux_dma_fence_signal #define dma_fence_signal_locked linux_dma_fence_signal_locked @@ -113,6 +114,8 @@ extern int linux_dma_fence_trace; void dma_fence_init(struct dma_fence *, const struct dma_fence_ops *, spinlock_t *, unsigned, unsigned); +void dma_fence_reset(struct dma_fence *, const struct dma_fence_ops *, + spinlock_t *, unsigned, unsigned); /* XXX extension */ void dma_fence_destroy(struct dma_fence *); void dma_fence_free(struct dma_fence *); Index: src/sys/external/bsd/drm2/linux/linux_dma_fence.c diff -u src/sys/external/bsd/drm2/linux/linux_dma_fence.c:1.17 src/sys/external/bsd/drm2/linux/linux_dma_fence.c:1.18 --- src/sys/external/bsd/drm2/linux/linux_dma_fence.c:1.17 Sun Dec 19 11:20:56 2021 +++ src/sys/external/bsd/drm2/linux/linux_dma_fence.c Sun Dec 19 12:00:48 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_dma_fence.c,v 1.17 2021/12/19 11:20:56 riastradh Exp $ */ +/* $NetBSD: linux_dma_fence.c,v 1.18 2021/12/19 12:00:48 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_dma_fence.c,v 1.17 2021/12/19 11:20:56 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_dma_fence.c,v 1.18 2021/12/19 12:00:48 riastradh Exp $"); #include <sys/atomic.h> #include <sys/condvar.h> @@ -83,11 +83,39 @@ dma_fence_init(struct dma_fence *fence, fence->context = context; fence->seqno = seqno; fence->ops = ops; + fence->error = 0; TAILQ_INIT(&fence->f_callbacks); cv_init(&fence->f_cv, "dmafence"); } /* + * dma_fence_reset(fence) + * + * Ensure fence is in a quiescent state. Allowed either for newly + * initialized or freed fences, but not fences with more than one + * reference. + * + * XXX extension to Linux API + */ +void +dma_fence_reset(struct dma_fence *fence, const struct dma_fence_ops *ops, + spinlock_t *lock, unsigned context, unsigned seqno) +{ + + KASSERT(kref_read(&fence->refcount) == 0 || + kref_read(&fence->refcount) == 1); + KASSERT(TAILQ_EMPTY(&fence->f_callbacks)); + KASSERT(fence->lock == lock); + KASSERT(fence->ops == ops); + + kref_init(&fence->refcount); + fence->flags = 0; + fence->context = context; + fence->seqno = seqno; + fence->error = 0; +} + +/* * dma_fence_destroy(fence) * * Clean up memory initialized with dma_fence_init. This is meant