drm/nouveau: rip out nvkm_client.super
No longer required now that userspace can't touch anything that might need it, and should fix DRM MM operations racing with each other, and the random hangs/crashes that come with that. Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Lyude Paul <lyude@redhat.com>
This commit is contained in:
@@ -9,7 +9,6 @@ struct nvif_client {
|
||||
const struct nvif_driver *driver;
|
||||
u64 version;
|
||||
u8 route;
|
||||
bool super;
|
||||
};
|
||||
|
||||
int nvif_client_ctor(struct nvif_client *parent, const char *name, u64 device,
|
||||
|
||||
@@ -11,7 +11,7 @@ struct nvif_driver {
|
||||
void (*fini)(void *priv);
|
||||
int (*suspend)(void *priv);
|
||||
int (*resume)(void *priv);
|
||||
int (*ioctl)(void *priv, bool super, void *data, u32 size, void **hack);
|
||||
int (*ioctl)(void *priv, void *data, u32 size, void **hack);
|
||||
void __iomem *(*map)(void *priv, u64 handle, u32 size);
|
||||
void (*unmap)(void *priv, void __iomem *ptr, u32 size);
|
||||
bool keep;
|
||||
|
||||
@@ -13,7 +13,6 @@ struct nvkm_client {
|
||||
struct nvkm_client_notify *notify[32];
|
||||
struct rb_root objroot;
|
||||
|
||||
bool super;
|
||||
void *data;
|
||||
int (*ntfy)(const void *, u32, const void *, u32);
|
||||
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
#include <core/os.h>
|
||||
struct nvkm_client;
|
||||
|
||||
int nvkm_ioctl(struct nvkm_client *, bool, void *, u32, void **);
|
||||
int nvkm_ioctl(struct nvkm_client *, void *, u32, void **);
|
||||
#endif
|
||||
|
||||
@@ -15,7 +15,6 @@ struct nvkm_vma {
|
||||
u8 refd:3; /* Current page type (index, or NONE for unreferenced). */
|
||||
bool used:1; /* Region allocated. */
|
||||
bool part:1; /* Region was split from an allocated region by map(). */
|
||||
bool user:1; /* Region user-allocated. */
|
||||
bool busy:1; /* Region busy (for temporarily preventing user access). */
|
||||
bool mapped:1; /* Region contains valid pages. */
|
||||
struct nvkm_memory *memory; /* Memory currently mapped into VMA. */
|
||||
|
||||
@@ -570,11 +570,9 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
|
||||
}
|
||||
|
||||
client->route = NVDRM_OBJECT_ABI16;
|
||||
client->super = true;
|
||||
ret = nvif_object_ctor(&chan->chan->user, "abi16Ntfy", info->handle,
|
||||
NV_DMA_IN_MEMORY, &args, sizeof(args),
|
||||
&ntfy->object);
|
||||
client->super = false;
|
||||
client->route = NVDRM_OBJECT_NVIF;
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
@@ -86,12 +86,6 @@ nouveau_channel_del(struct nouveau_channel **pchan)
|
||||
struct nouveau_channel *chan = *pchan;
|
||||
if (chan) {
|
||||
struct nouveau_cli *cli = (void *)chan->user.client;
|
||||
bool super;
|
||||
|
||||
if (cli) {
|
||||
super = cli->base.super;
|
||||
cli->base.super = true;
|
||||
}
|
||||
|
||||
if (chan->fence)
|
||||
nouveau_fence(chan->drm)->context_del(chan);
|
||||
@@ -111,9 +105,6 @@ nouveau_channel_del(struct nouveau_channel **pchan)
|
||||
nouveau_bo_unpin(chan->push.buffer);
|
||||
nouveau_bo_ref(NULL, &chan->push.buffer);
|
||||
kfree(chan);
|
||||
|
||||
if (cli)
|
||||
cli->base.super = super;
|
||||
}
|
||||
*pchan = NULL;
|
||||
}
|
||||
@@ -512,20 +503,16 @@ nouveau_channel_new(struct nouveau_drm *drm, struct nvif_device *device,
|
||||
struct nouveau_channel **pchan)
|
||||
{
|
||||
struct nouveau_cli *cli = (void *)device->object.client;
|
||||
bool super;
|
||||
int ret;
|
||||
|
||||
/* hack until fencenv50 is fixed, and agp access relaxed */
|
||||
super = cli->base.super;
|
||||
cli->base.super = true;
|
||||
|
||||
ret = nouveau_channel_ind(drm, device, arg0, priv, pchan);
|
||||
if (ret) {
|
||||
NV_PRINTK(dbg, cli, "ib channel create, %d\n", ret);
|
||||
ret = nouveau_channel_dma(drm, device, pchan);
|
||||
if (ret) {
|
||||
NV_PRINTK(dbg, cli, "dma channel create, %d\n", ret);
|
||||
goto done;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -533,15 +520,13 @@ nouveau_channel_new(struct nouveau_drm *drm, struct nvif_device *device,
|
||||
if (ret) {
|
||||
NV_PRINTK(err, cli, "channel failed to initialise, %d\n", ret);
|
||||
nouveau_channel_del(pchan);
|
||||
goto done;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = nouveau_svmm_join((*pchan)->vmm->svmm, (*pchan)->inst);
|
||||
if (ret)
|
||||
nouveau_channel_del(pchan);
|
||||
|
||||
done:
|
||||
cli->base.super = super;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1087,8 +1087,6 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
cli->base.super = false;
|
||||
|
||||
fpriv->driver_priv = cli;
|
||||
|
||||
mutex_lock(&drm->client.mutex);
|
||||
|
||||
@@ -41,8 +41,6 @@ nouveau_mem_map(struct nouveau_mem *mem,
|
||||
struct gf100_vmm_map_v0 gf100;
|
||||
} args;
|
||||
u32 argc = 0;
|
||||
bool super;
|
||||
int ret;
|
||||
|
||||
switch (vmm->object.oclass) {
|
||||
case NVIF_CLASS_VMM_NV04:
|
||||
@@ -73,12 +71,7 @@ nouveau_mem_map(struct nouveau_mem *mem,
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
super = vmm->object.client->super;
|
||||
vmm->object.client->super = true;
|
||||
ret = nvif_vmm_map(vmm, vma->addr, mem->mem.size, &args, argc,
|
||||
&mem->mem, 0);
|
||||
vmm->object.client->super = super;
|
||||
return ret;
|
||||
return nvif_vmm_map(vmm, vma->addr, mem->mem.size, &args, argc, &mem->mem, 0);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -99,7 +92,6 @@ nouveau_mem_host(struct ttm_resource *reg, struct ttm_tt *tt)
|
||||
struct nouveau_drm *drm = cli->drm;
|
||||
struct nvif_mmu *mmu = &cli->mmu;
|
||||
struct nvif_mem_ram_v0 args = {};
|
||||
bool super = cli->base.super;
|
||||
u8 type;
|
||||
int ret;
|
||||
|
||||
@@ -122,11 +114,9 @@ nouveau_mem_host(struct ttm_resource *reg, struct ttm_tt *tt)
|
||||
args.dma = tt->dma_address;
|
||||
|
||||
mutex_lock(&drm->master.lock);
|
||||
cli->base.super = true;
|
||||
ret = nvif_mem_ctor_type(mmu, "ttmHostMem", cli->mem->oclass, type, PAGE_SHIFT,
|
||||
reg->num_pages << PAGE_SHIFT,
|
||||
&args, sizeof(args), &mem->mem);
|
||||
cli->base.super = super;
|
||||
mutex_unlock(&drm->master.lock);
|
||||
return ret;
|
||||
}
|
||||
@@ -138,12 +128,10 @@ nouveau_mem_vram(struct ttm_resource *reg, bool contig, u8 page)
|
||||
struct nouveau_cli *cli = mem->cli;
|
||||
struct nouveau_drm *drm = cli->drm;
|
||||
struct nvif_mmu *mmu = &cli->mmu;
|
||||
bool super = cli->base.super;
|
||||
u64 size = ALIGN(reg->num_pages << PAGE_SHIFT, 1 << page);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&drm->master.lock);
|
||||
cli->base.super = true;
|
||||
switch (cli->mem->oclass) {
|
||||
case NVIF_CLASS_MEM_GF100:
|
||||
ret = nvif_mem_ctor_type(mmu, "ttmVram", cli->mem->oclass,
|
||||
@@ -167,7 +155,6 @@ nouveau_mem_vram(struct ttm_resource *reg, bool contig, u8 page)
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
cli->base.super = super;
|
||||
mutex_unlock(&drm->master.lock);
|
||||
|
||||
reg->start = mem->mem.addr >> PAGE_SHIFT;
|
||||
|
||||
@@ -52,9 +52,9 @@ nvkm_client_map(void *priv, u64 handle, u32 size)
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_client_ioctl(void *priv, bool super, void *data, u32 size, void **hack)
|
||||
nvkm_client_ioctl(void *priv, void *data, u32 size, void **hack)
|
||||
{
|
||||
return nvkm_ioctl(priv, super, data, size, hack);
|
||||
return nvkm_ioctl(priv, data, size, hack);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -237,14 +237,11 @@ void
|
||||
nouveau_svmm_invalidate(struct nouveau_svmm *svmm, u64 start, u64 limit)
|
||||
{
|
||||
if (limit > start) {
|
||||
bool super = svmm->vmm->vmm.object.client->super;
|
||||
svmm->vmm->vmm.object.client->super = true;
|
||||
nvif_object_mthd(&svmm->vmm->vmm.object, NVIF_VMM_V0_PFNCLR,
|
||||
&(struct nvif_vmm_pfnclr_v0) {
|
||||
.addr = start,
|
||||
.size = limit - start,
|
||||
}, sizeof(struct nvif_vmm_pfnclr_v0));
|
||||
svmm->vmm->vmm.object.client->super = super;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -634,9 +631,7 @@ static int nouveau_atomic_range_fault(struct nouveau_svmm *svmm,
|
||||
NVIF_VMM_PFNMAP_V0_A |
|
||||
NVIF_VMM_PFNMAP_V0_HOST;
|
||||
|
||||
svmm->vmm->vmm.object.client->super = true;
|
||||
ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, size, NULL);
|
||||
svmm->vmm->vmm.object.client->super = false;
|
||||
mutex_unlock(&svmm->mutex);
|
||||
|
||||
unlock_page(page);
|
||||
@@ -702,9 +697,7 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm,
|
||||
|
||||
nouveau_hmm_convert_pfn(drm, &range, args);
|
||||
|
||||
svmm->vmm->vmm.object.client->super = true;
|
||||
ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, size, NULL);
|
||||
svmm->vmm->vmm.object.client->super = false;
|
||||
mutex_unlock(&svmm->mutex);
|
||||
|
||||
out:
|
||||
@@ -928,10 +921,8 @@ nouveau_pfns_map(struct nouveau_svmm *svmm, struct mm_struct *mm,
|
||||
|
||||
mutex_lock(&svmm->mutex);
|
||||
|
||||
svmm->vmm->vmm.object.client->super = true;
|
||||
ret = nvif_object_ioctl(&svmm->vmm->vmm.object, args, sizeof(*args) +
|
||||
npages * sizeof(args->p.phys[0]), NULL);
|
||||
svmm->vmm->vmm.object.client->super = false;
|
||||
|
||||
mutex_unlock(&svmm->mutex);
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
int
|
||||
nvif_client_ioctl(struct nvif_client *client, void *data, u32 size)
|
||||
{
|
||||
return client->driver->ioctl(client->object.priv, client->super, data, size, NULL);
|
||||
return client->driver->ioctl(client->object.priv, data, size, NULL);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -80,7 +80,6 @@ nvif_client_ctor(struct nvif_client *parent, const char *name, u64 device,
|
||||
client->object.client = client;
|
||||
client->object.handle = ~0;
|
||||
client->route = NVIF_IOCTL_V0_ROUTE_NVIF;
|
||||
client->super = true;
|
||||
client->driver = parent->driver;
|
||||
|
||||
if (ret == 0) {
|
||||
|
||||
@@ -44,8 +44,7 @@ nvif_object_ioctl(struct nvif_object *object, void *data, u32 size, void **hack)
|
||||
} else
|
||||
return -ENOSYS;
|
||||
|
||||
return client->driver->ioctl(client->object.priv, client->super,
|
||||
data, size, hack);
|
||||
return client->driver->ioctl(client->object.priv, data, size, hack);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -426,8 +426,7 @@ nvkm_ioctl_path(struct nvkm_client *client, u64 handle, u32 type,
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_ioctl(struct nvkm_client *client, bool supervisor,
|
||||
void *data, u32 size, void **hack)
|
||||
nvkm_ioctl(struct nvkm_client *client, void *data, u32 size, void **hack)
|
||||
{
|
||||
struct nvkm_object *object = &client->object;
|
||||
union {
|
||||
@@ -435,7 +434,6 @@ nvkm_ioctl(struct nvkm_client *client, bool supervisor,
|
||||
} *args = data;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
client->super = supervisor;
|
||||
nvif_ioctl(object, "size %d\n", size);
|
||||
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <core/client.h>
|
||||
#include <core/gpuobj.h>
|
||||
#include <subdev/fb.h>
|
||||
#include <subdev/instmem.h>
|
||||
|
||||
#include <nvif/cl0002.h>
|
||||
#include <nvif/unpack.h>
|
||||
@@ -72,11 +71,7 @@ nvkm_dmaobj_ctor(const struct nvkm_dmaobj_func *func, struct nvkm_dma *dma,
|
||||
union {
|
||||
struct nv_dma_v0 v0;
|
||||
} *args = *pdata;
|
||||
struct nvkm_device *device = dma->engine.subdev.device;
|
||||
struct nvkm_client *client = oclass->client;
|
||||
struct nvkm_object *parent = oclass->parent;
|
||||
struct nvkm_instmem *instmem = device->imem;
|
||||
struct nvkm_fb *fb = device->fb;
|
||||
void *data = *pdata;
|
||||
u32 size = *psize;
|
||||
int ret = -ENOSYS;
|
||||
@@ -109,23 +104,13 @@ nvkm_dmaobj_ctor(const struct nvkm_dmaobj_func *func, struct nvkm_dma *dma,
|
||||
dmaobj->target = NV_MEM_TARGET_VM;
|
||||
break;
|
||||
case NV_DMA_V0_TARGET_VRAM:
|
||||
if (!client->super) {
|
||||
if (dmaobj->limit >= fb->ram->size - instmem->reserved)
|
||||
return -EACCES;
|
||||
if (device->card_type >= NV_50)
|
||||
return -EACCES;
|
||||
}
|
||||
dmaobj->target = NV_MEM_TARGET_VRAM;
|
||||
break;
|
||||
case NV_DMA_V0_TARGET_PCI:
|
||||
if (!client->super)
|
||||
return -EACCES;
|
||||
dmaobj->target = NV_MEM_TARGET_PCI;
|
||||
break;
|
||||
case NV_DMA_V0_TARGET_PCI_US:
|
||||
case NV_DMA_V0_TARGET_AGP:
|
||||
if (!client->super)
|
||||
return -EACCES;
|
||||
dmaobj->target = NV_MEM_TARGET_PCI_NOSNOOP;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -341,8 +341,6 @@ gk104_fifo_gpfifo_new(struct gk104_fifo *fifo, const struct nvkm_oclass *oclass,
|
||||
"runlist %016llx priv %d\n",
|
||||
args->v0.version, args->v0.vmm, args->v0.ioffset,
|
||||
args->v0.ilength, args->v0.runlist, args->v0.priv);
|
||||
if (args->v0.priv && !oclass->client->super)
|
||||
return -EINVAL;
|
||||
return gk104_fifo_gpfifo_new_(fifo,
|
||||
&args->v0.runlist,
|
||||
&args->v0.chid,
|
||||
|
||||
@@ -226,8 +226,6 @@ gv100_fifo_gpfifo_new(struct gk104_fifo *fifo, const struct nvkm_oclass *oclass,
|
||||
"runlist %016llx priv %d\n",
|
||||
args->v0.version, args->v0.vmm, args->v0.ioffset,
|
||||
args->v0.ilength, args->v0.runlist, args->v0.priv);
|
||||
if (args->v0.priv && !oclass->client->super)
|
||||
return -EINVAL;
|
||||
return gv100_fifo_gpfifo_new_(&gv100_fifo_gpfifo, fifo,
|
||||
&args->v0.runlist,
|
||||
&args->v0.chid,
|
||||
|
||||
@@ -65,8 +65,6 @@ tu102_fifo_gpfifo_new(struct gk104_fifo *fifo, const struct nvkm_oclass *oclass,
|
||||
"runlist %016llx priv %d\n",
|
||||
args->v0.version, args->v0.vmm, args->v0.ioffset,
|
||||
args->v0.ilength, args->v0.runlist, args->v0.priv);
|
||||
if (args->v0.priv && !oclass->client->super)
|
||||
return -EINVAL;
|
||||
return gv100_fifo_gpfifo_new_(&tu102_fifo_gpfifo, fifo,
|
||||
&args->v0.runlist,
|
||||
&args->v0.chid,
|
||||
|
||||
@@ -41,7 +41,7 @@ nvkm_umem_search(struct nvkm_client *client, u64 handle)
|
||||
|
||||
object = nvkm_object_search(client, handle, &nvkm_umem);
|
||||
if (IS_ERR(object)) {
|
||||
if (client->super && client != master) {
|
||||
if (client != master) {
|
||||
spin_lock(&master->lock);
|
||||
list_for_each_entry(umem, &master->umem, head) {
|
||||
if (umem->object.object == handle) {
|
||||
@@ -53,8 +53,7 @@ nvkm_umem_search(struct nvkm_client *client, u64 handle)
|
||||
}
|
||||
} else {
|
||||
umem = nvkm_umem(object);
|
||||
if (!umem->priv || client->super)
|
||||
memory = nvkm_memory_ref(umem->memory);
|
||||
memory = nvkm_memory_ref(umem->memory);
|
||||
}
|
||||
|
||||
return memory ? memory : ERR_PTR(-ENOENT);
|
||||
@@ -167,7 +166,6 @@ nvkm_umem_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
|
||||
nvkm_object_ctor(&nvkm_umem, oclass, &umem->object);
|
||||
umem->mmu = mmu;
|
||||
umem->type = mmu->type[type].type;
|
||||
umem->priv = oclass->client->super;
|
||||
INIT_LIST_HEAD(&umem->head);
|
||||
*pobject = &umem->object;
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ struct nvkm_umem {
|
||||
struct nvkm_object object;
|
||||
struct nvkm_mmu *mmu;
|
||||
u8 type:8;
|
||||
bool priv:1;
|
||||
bool mappable:1;
|
||||
bool io:1;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ nvkm_ummu_sclass(struct nvkm_object *object, int index,
|
||||
{
|
||||
struct nvkm_mmu *mmu = nvkm_ummu(object)->mmu;
|
||||
|
||||
if (mmu->func->mem.user.oclass && oclass->client->super) {
|
||||
if (mmu->func->mem.user.oclass) {
|
||||
if (index-- == 0) {
|
||||
oclass->base = mmu->func->mem.user;
|
||||
oclass->ctor = nvkm_umem_new;
|
||||
|
||||
@@ -45,7 +45,6 @@ nvkm_uvmm_search(struct nvkm_client *client, u64 handle)
|
||||
static int
|
||||
nvkm_uvmm_mthd_pfnclr(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
{
|
||||
struct nvkm_client *client = uvmm->object.client;
|
||||
union {
|
||||
struct nvif_vmm_pfnclr_v0 v0;
|
||||
} *args = argv;
|
||||
@@ -59,9 +58,6 @@ nvkm_uvmm_mthd_pfnclr(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
} else
|
||||
return ret;
|
||||
|
||||
if (!client->super)
|
||||
return -ENOENT;
|
||||
|
||||
if (size) {
|
||||
mutex_lock(&vmm->mutex);
|
||||
ret = nvkm_vmm_pfn_unmap(vmm, addr, size);
|
||||
@@ -74,7 +70,6 @@ nvkm_uvmm_mthd_pfnclr(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
static int
|
||||
nvkm_uvmm_mthd_pfnmap(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
{
|
||||
struct nvkm_client *client = uvmm->object.client;
|
||||
union {
|
||||
struct nvif_vmm_pfnmap_v0 v0;
|
||||
} *args = argv;
|
||||
@@ -93,9 +88,6 @@ nvkm_uvmm_mthd_pfnmap(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
} else
|
||||
return ret;
|
||||
|
||||
if (!client->super)
|
||||
return -ENOENT;
|
||||
|
||||
if (size) {
|
||||
mutex_lock(&vmm->mutex);
|
||||
ret = nvkm_vmm_pfn_map(vmm, page, addr, size, phys);
|
||||
@@ -108,7 +100,6 @@ nvkm_uvmm_mthd_pfnmap(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
static int
|
||||
nvkm_uvmm_mthd_unmap(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
{
|
||||
struct nvkm_client *client = uvmm->object.client;
|
||||
union {
|
||||
struct nvif_vmm_unmap_v0 v0;
|
||||
} *args = argv;
|
||||
@@ -130,9 +121,8 @@ nvkm_uvmm_mthd_unmap(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ret = -ENOENT, (!vma->user && !client->super) || vma->busy) {
|
||||
VMM_DEBUG(vmm, "denied %016llx: %d %d %d", addr,
|
||||
vma->user, !client->super, vma->busy);
|
||||
if (ret = -ENOENT, vma->busy) {
|
||||
VMM_DEBUG(vmm, "denied %016llx: %d", addr, vma->busy);
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -181,9 +171,8 @@ nvkm_uvmm_mthd_map(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (ret = -ENOENT, (!vma->user && !client->super) || vma->busy) {
|
||||
VMM_DEBUG(vmm, "denied %016llx: %d %d %d", addr,
|
||||
vma->user, !client->super, vma->busy);
|
||||
if (ret = -ENOENT, vma->busy) {
|
||||
VMM_DEBUG(vmm, "denied %016llx: %d", addr, vma->busy);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -230,7 +219,6 @@ fail:
|
||||
static int
|
||||
nvkm_uvmm_mthd_put(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
{
|
||||
struct nvkm_client *client = uvmm->object.client;
|
||||
union {
|
||||
struct nvif_vmm_put_v0 v0;
|
||||
} *args = argv;
|
||||
@@ -252,9 +240,8 @@ nvkm_uvmm_mthd_put(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ret = -ENOENT, (!vma->user && !client->super) || vma->busy) {
|
||||
VMM_DEBUG(vmm, "denied %016llx: %d %d %d", addr,
|
||||
vma->user, !client->super, vma->busy);
|
||||
if (ret = -ENOENT, vma->busy) {
|
||||
VMM_DEBUG(vmm, "denied %016llx: %d", addr, vma->busy);
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -268,7 +255,6 @@ done:
|
||||
static int
|
||||
nvkm_uvmm_mthd_get(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
{
|
||||
struct nvkm_client *client = uvmm->object.client;
|
||||
union {
|
||||
struct nvif_vmm_get_v0 v0;
|
||||
} *args = argv;
|
||||
@@ -297,7 +283,6 @@ nvkm_uvmm_mthd_get(struct nvkm_uvmm *uvmm, void *argv, u32 argc)
|
||||
return ret;
|
||||
|
||||
args->v0.addr = vma->addr;
|
||||
vma->user = !client->super;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -774,7 +774,6 @@ nvkm_vma_tail(struct nvkm_vma *vma, u64 tail)
|
||||
new->refd = vma->refd;
|
||||
new->used = vma->used;
|
||||
new->part = vma->part;
|
||||
new->user = vma->user;
|
||||
new->busy = vma->busy;
|
||||
new->mapped = vma->mapped;
|
||||
list_add(&new->head, &vma->head);
|
||||
@@ -951,7 +950,7 @@ nvkm_vmm_node_split(struct nvkm_vmm *vmm,
|
||||
static void
|
||||
nvkm_vma_dump(struct nvkm_vma *vma)
|
||||
{
|
||||
printk(KERN_ERR "%016llx %016llx %c%c%c%c%c%c%c%c%c %p\n",
|
||||
printk(KERN_ERR "%016llx %016llx %c%c%c%c%c%c%c%c %p\n",
|
||||
vma->addr, (u64)vma->size,
|
||||
vma->used ? '-' : 'F',
|
||||
vma->mapref ? 'R' : '-',
|
||||
@@ -959,7 +958,6 @@ nvkm_vma_dump(struct nvkm_vma *vma)
|
||||
vma->page != NVKM_VMA_PAGE_NONE ? '0' + vma->page : '-',
|
||||
vma->refd != NVKM_VMA_PAGE_NONE ? '0' + vma->refd : '-',
|
||||
vma->part ? 'P' : '-',
|
||||
vma->user ? 'U' : '-',
|
||||
vma->busy ? 'B' : '-',
|
||||
vma->mapped ? 'M' : '-',
|
||||
vma->memory);
|
||||
@@ -1024,7 +1022,6 @@ nvkm_vmm_ctor_managed(struct nvkm_vmm *vmm, u64 addr, u64 size)
|
||||
vma->mapref = true;
|
||||
vma->sparse = false;
|
||||
vma->used = true;
|
||||
vma->user = true;
|
||||
nvkm_vmm_node_insert(vmm, vma);
|
||||
list_add_tail(&vma->head, &vmm->list);
|
||||
return 0;
|
||||
@@ -1615,7 +1612,6 @@ nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
|
||||
vma->page = NVKM_VMA_PAGE_NONE;
|
||||
vma->refd = NVKM_VMA_PAGE_NONE;
|
||||
vma->used = false;
|
||||
vma->user = false;
|
||||
nvkm_vmm_put_region(vmm, vma);
|
||||
}
|
||||
|
||||
|
||||
@@ -534,15 +534,13 @@ int
|
||||
gp100_vmm_mthd(struct nvkm_vmm *vmm,
|
||||
struct nvkm_client *client, u32 mthd, void *argv, u32 argc)
|
||||
{
|
||||
if (client->super) {
|
||||
switch (mthd) {
|
||||
case GP100_VMM_VN_FAULT_REPLAY:
|
||||
return gp100_vmm_fault_replay(vmm, argv, argc);
|
||||
case GP100_VMM_VN_FAULT_CANCEL:
|
||||
return gp100_vmm_fault_cancel(vmm, argv, argc);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (mthd) {
|
||||
case GP100_VMM_VN_FAULT_REPLAY:
|
||||
return gp100_vmm_fault_replay(vmm, argv, argc);
|
||||
case GP100_VMM_VN_FAULT_CANCEL:
|
||||
return gp100_vmm_fault_cancel(vmm, argv, argc);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user