mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-14 12:37:32 +00:00
drm/nouveau: prepare for reporting channel owner
- record channel owner process name - add some helpers for accessing this information - let nouveau_enum hold additional value (will be needed in the next patch) Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
f533da1027
commit
a2896cede0
7 changed files with 36 additions and 5 deletions
|
@ -99,3 +99,13 @@ nouveau_client_fini(struct nouveau_client *client, bool suspend)
|
|||
nv_debug(client, "%s completed with %d\n", name[suspend], ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *
|
||||
nouveau_client_name(void *obj)
|
||||
{
|
||||
const char *client_name = "unknown";
|
||||
struct nouveau_client *client = nouveau_client(obj);
|
||||
if (client)
|
||||
client_name = client->name;
|
||||
return client_name;
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ nouveau_enum_find(const struct nouveau_enum *en, u32 value)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
const struct nouveau_enum *
|
||||
nouveau_enum_print(const struct nouveau_enum *en, u32 value)
|
||||
{
|
||||
en = nouveau_enum_find(en, value);
|
||||
|
@ -48,6 +48,7 @@ nouveau_enum_print(const struct nouveau_enum *en, u32 value)
|
|||
pr_cont("%s", en->name);
|
||||
else
|
||||
pr_cont("(unknown enum 0x%08x)", value);
|
||||
return en;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
|
||||
#include <core/client.h>
|
||||
#include <core/object.h>
|
||||
#include <core/handle.h>
|
||||
#include <core/class.h>
|
||||
|
@ -146,6 +147,20 @@ nouveau_fifo_chid(struct nouveau_fifo *priv, struct nouveau_object *object)
|
|||
return -1;
|
||||
}
|
||||
|
||||
const char *
|
||||
nouveau_client_name_for_fifo_chid(struct nouveau_fifo *fifo, u32 chid)
|
||||
{
|
||||
struct nouveau_fifo_chan *chan = NULL;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&fifo->lock, flags);
|
||||
if (chid >= fifo->min && chid <= fifo->max)
|
||||
chan = (void *)fifo->channel[chid];
|
||||
spin_unlock_irqrestore(&fifo->lock, flags);
|
||||
|
||||
return nouveau_client_name(chan);
|
||||
}
|
||||
|
||||
void
|
||||
nouveau_fifo_destroy(struct nouveau_fifo *priv)
|
||||
{
|
||||
|
|
|
@ -7,7 +7,7 @@ struct nouveau_client {
|
|||
struct nouveau_namedb base;
|
||||
struct nouveau_handle *root;
|
||||
struct nouveau_object *device;
|
||||
char name[16];
|
||||
char name[32];
|
||||
u32 debug;
|
||||
struct nouveau_vm *vm;
|
||||
};
|
||||
|
@ -41,5 +41,6 @@ int nouveau_client_create_(const char *name, u64 device, const char *cfg,
|
|||
|
||||
int nouveau_client_init(struct nouveau_client *);
|
||||
int nouveau_client_fini(struct nouveau_client *, bool suspend);
|
||||
const char *nouveau_client_name(void *obj);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -5,12 +5,13 @@ struct nouveau_enum {
|
|||
u32 value;
|
||||
const char *name;
|
||||
const void *data;
|
||||
u32 data2;
|
||||
};
|
||||
|
||||
const struct nouveau_enum *
|
||||
nouveau_enum_find(const struct nouveau_enum *, u32 value);
|
||||
|
||||
void
|
||||
const struct nouveau_enum *
|
||||
nouveau_enum_print(const struct nouveau_enum *en, u32 value);
|
||||
|
||||
struct nouveau_bitfield {
|
||||
|
|
|
@ -92,6 +92,8 @@ int nouveau_fifo_create_(struct nouveau_object *, struct nouveau_object *,
|
|||
struct nouveau_oclass *, int min, int max,
|
||||
int size, void **);
|
||||
void nouveau_fifo_destroy(struct nouveau_fifo *);
|
||||
const char *
|
||||
nouveau_client_name_for_fifo_chid(struct nouveau_fifo *fifo, u32 chid);
|
||||
|
||||
#define _nouveau_fifo_init _nouveau_engine_init
|
||||
#define _nouveau_fifo_fini _nouveau_engine_fini
|
||||
|
|
|
@ -543,10 +543,11 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
|
|||
struct pci_dev *pdev = dev->pdev;
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct nouveau_cli *cli;
|
||||
char name[16];
|
||||
char name[32], tmpname[TASK_COMM_LEN];
|
||||
int ret;
|
||||
|
||||
snprintf(name, sizeof(name), "%d", pid_nr(fpriv->pid));
|
||||
get_task_comm(tmpname, current);
|
||||
snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid));
|
||||
|
||||
ret = nouveau_cli_create(pdev, name, sizeof(*cli), (void **)&cli);
|
||||
if (ret)
|
||||
|
|
Loading…
Reference in a new issue