mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 17:25:35 +03:00
Currently, each process holding an open TegraDRM channel reserves for itself one of the limited number of hardware memory contexts. Attempting to allocate a channel when all contexts are in use results in failure. While we cannot have more contexts than the hardware supports in active use, idle channels don't necessarily need to have a backing memory context. As such, in this patch, we add another layer to allow hardware memory contexts to be "stolen away" by channels that are in active use, from idle processes. The way this is implemented, is by keeping track of memory mappings on each abstracted memory context. If we need to steal that memory context's backing hardware context, we unmap everything from it and give it away. When that abstracted memory context is needed again (re-activated), we attempt to allocate or steal another hardware context and re-map the previously unmapped buffers. Unfortunately, this means additional overhead and unpredictability at submit time. Submit can fail if we cannot re-allocate a backing memory context. Future work includes a provision for un-stealable backing hardware memory contexts for processes requiring more determinism, as well as optimization and cosmetic improvements. Bug 4403250 Bug 4399310 Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Change-Id: I3d13e3476f1bff3c4757152254496cddaaafd76a Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3058905 Reviewed-by: Santosh BS <santoshb@nvidia.com> GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3227749 GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com> Tested-by: Dane Liu <danel@nvidia.com> Reviewed-by: Bibek Basu <bbasu@nvidia.com>
53 lines
990 B
C
53 lines
990 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Host1x context devices
|
|
*
|
|
* Copyright (c) 2020, NVIDIA Corporation.
|
|
*/
|
|
|
|
#ifndef __HOST1X_CONTEXT_H
|
|
#define __HOST1X_CONTEXT_H
|
|
|
|
#include <linux/mutex.h>
|
|
#include <linux/refcount.h>
|
|
|
|
struct host1x;
|
|
|
|
extern struct bus_type host1x_context_device_bus_type;
|
|
|
|
struct host1x_memory_context_list {
|
|
struct mutex lock;
|
|
struct host1x_hw_memory_context *devs;
|
|
unsigned int len;
|
|
};
|
|
|
|
struct host1x_hw_memory_context {
|
|
struct host1x *host;
|
|
|
|
refcount_t ref;
|
|
struct pid *owner;
|
|
|
|
struct device dev;
|
|
u64 dma_mask;
|
|
u32 stream_id;
|
|
|
|
struct list_head owners;
|
|
unsigned int active;
|
|
};
|
|
|
|
#ifdef CONFIG_IOMMU_API
|
|
int host1x_memory_context_list_init(struct host1x *host1x);
|
|
void host1x_memory_context_list_free(struct host1x_memory_context_list *cdl);
|
|
#else
|
|
static inline int host1x_memory_context_list_init(struct host1x *host1x)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void host1x_memory_context_list_free(struct host1x_memory_context_list *cdl)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#endif
|