Fix /proc files to output all available data (In recent kernels, they have

been truncating the output.)
This commit is contained in:
Rik Faith 2001-02-02 17:59:50 +00:00
parent 0af4b005af
commit 3239b80b18
6 changed files with 274 additions and 140 deletions

View file

@ -303,13 +303,13 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
#define DRM_PROC_LIMIT (PAGE_SIZE-80)
#define DRM_PROC_PRINT(fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) return len;
#define DRM_PROC_PRINT(fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) { *eof = 1; return len - offset; }
#define DRM_PROC_PRINT_RET(ret, fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) { ret; return len; }
#define DRM_PROC_PRINT_RET(ret, fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) { ret; *eof = 1; return len - offset; }
/* Internal types and structures */
#define DRM_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
@ -701,7 +701,7 @@ extern int drm_proc_cleanup(int minor,
/* Memory management support (memory.c) */
extern void DRM(mem_init)(void);
extern int DRM(mem_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
extern void *DRM(alloc)(size_t size, int area);
extern void *DRM(realloc)(void *oldpt, size_t oldsize, size_t size,
int area);

View file

@ -96,13 +96,19 @@ void DRM(mem_init)(void)
/* drm_mem_info is called whenever a process reads /dev/drm/mem. */
static int DRM(_mem_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data)
int request, int *eof, void *data)
{
drm_mem_stats_t *pt;
int len = 0;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*eof = 0;
*start = &buf[offset];
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
DRM_PROC_PRINT(" total counts "
" | outstanding \n");
DRM_PROC_PRINT("type alloc freed fail bytes freed"
@ -126,7 +132,9 @@ static int DRM(_mem_info)(char *buf, char **start, off_t offset,
- (long)pt->bytes_freed);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
int DRM(mem_info)(char *buf, char **start, off_t offset,

View file

@ -27,28 +27,32 @@
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*
* Acknowledgements:
* Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
* the problem with the proc files not outputting all their information.
*/
#define __NO_VERSION__
#include "drmP.h"
static int DRM(name_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(vm_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(clients_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(queues_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(bufs_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
#if DRM_DEBUG_CODE
static int DRM(vma_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
#endif
#if DRM_DMA_HISTOGRAM
static int DRM(histo_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
#endif
struct drm_proc_list {
@ -129,14 +133,19 @@ int DRM(proc_cleanup)(int minor, struct proc_dir_entry *root,
return 0;
}
static int DRM(name_info)(char *buf, char **start, off_t offset, int len,
static int DRM(name_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
if (dev->unique) {
DRM_PROC_PRINT("%s 0x%x %s\n",
@ -144,13 +153,17 @@ static int DRM(name_info)(char *buf, char **start, off_t offset, int len,
} else {
DRM_PROC_PRINT("%s 0x%x\n", dev->name, dev->device);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(_vm_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_vm_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_map_t *map;
/* Hardcoded from _DRM_FRAME_BUFFER,
_DRM_REGISTERS, _DRM_SHM, and
@ -159,9 +172,14 @@ static int DRM(_vm_info)(char *buf, char **start, off_t offset, int len,
const char *type;
int i;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("slot offset size type flags "
"address mtrr\n\n");
for (i = 0; i < dev->map_count; i++) {
@ -182,32 +200,40 @@ static int DRM(_vm_info)(char *buf, char **start, off_t offset, int len,
}
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(vm_info)(char *buf, char **start, off_t offset, int len,
static int DRM(vm_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_vm_info)(buf, start, offset, len, eof, data);
ret = DRM(_vm_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
static int DRM(_queues_info)(char *buf, char **start, off_t offset, int len,
int *eof, void *data)
static int DRM(_queues_info)(char *buf, char **start, off_t offset,
int request, int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
int i;
drm_queue_t *q;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT(" ctx/flags use fin"
" blk/rw/rwf wait flushed queued"
" locks\n\n");
@ -234,17 +260,19 @@ static int DRM(_queues_info)(char *buf, char **start, off_t offset, int len,
atomic_dec(&q->use_count);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(queues_info)(char *buf, char **start, off_t offset, int len,
static int DRM(queues_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_queues_info)(buf, start, offset, len, eof, data);
ret = DRM(_queues_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
@ -252,17 +280,22 @@ static int DRM(queues_info)(char *buf, char **start, off_t offset, int len,
/* drm_bufs_info is called whenever a process reads
/dev/dri/<dev>/bufs. */
static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_device_dma_t *dma = dev->dma;
int i;
if (!dma) return 0;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (!dma || offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT(" o size count free segs pages kB\n\n");
for (i = 0; i <= DRM_MAX_ORDER; i++) {
if (dma->bufs[i].buf_count)
@ -286,31 +319,39 @@ static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int len,
}
DRM_PROC_PRINT("\n");
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(bufs_info)(char *buf, char **start, off_t offset, int len,
static int DRM(bufs_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_bufs_info)(buf, start, offset, len, eof, data);
ret = DRM(_bufs_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
static int DRM(_clients_info)(char *buf, char **start, off_t offset, int len,
int *eof, void *data)
static int DRM(_clients_info)(char *buf, char **start, off_t offset,
int request, int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_file_t *priv;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("a dev pid uid magic ioctls\n\n");
for (priv = dev->file_first; priv; priv = priv->next) {
DRM_PROC_PRINT("%c %3d %5d %5d %10u %10lu\n",
@ -322,17 +363,19 @@ static int DRM(_clients_info)(char *buf, char **start, off_t offset, int len,
priv->ioctl_count);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(clients_info)(char *buf, char **start, off_t offset, int len,
int *eof, void *data)
static int DRM(clients_info)(char *buf, char **start, off_t offset,
int request, int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_clients_info)(buf, start, offset, len, eof, data);
ret = DRM(_clients_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
@ -341,10 +384,11 @@ static int DRM(clients_info)(char *buf, char **start, off_t offset, int len,
#define DRM_VMA_VERBOSE 0
static int DRM(_vma_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_vma_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_vma_entry_t *pt;
struct vm_area_struct *vma;
#if DRM_VMA_VERBOSE
@ -358,9 +402,14 @@ static int DRM(_vma_info)(char *buf, char **start, off_t offset, int len,
unsigned int pgprot;
#endif
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("vma use count: %d, high_memory = %p, 0x%08lx\n",
atomic_read(&dev->vma_count),
high_memory, virt_to_phys(high_memory));
@ -416,17 +465,19 @@ static int DRM(_vma_info)(char *buf, char **start, off_t offset, int len,
#endif
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(vma_info)(char *buf, char **start, off_t offset, int len,
static int DRM(vma_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_vma_info)(buf, start, offset, len, eof, data);
ret = DRM(_vma_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
@ -434,19 +485,24 @@ static int DRM(vma_info)(char *buf, char **start, off_t offset, int len,
#if DRM_DMA_HISTOGRAM
static int DRM(_histo_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_histo_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_device_dma_t *dma = dev->dma;
int i;
unsigned long slot_value = DRM_DMA_HISTOGRAM_INITIAL;
unsigned long prev_value = 0;
drm_buf_t *buffer;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("general statistics:\n");
DRM_PROC_PRINT("total %10u\n", atomic_read(&dev->histo.total));
@ -548,17 +604,20 @@ static int DRM(_histo_info)(char *buf, char **start, off_t offset, int len,
prev_value = slot_value;
slot_value = DRM_DMA_HISTOGRAM_NEXT(slot_value);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(histo_info)(char *buf, char **start, off_t offset, int len,
static int DRM(histo_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_histo_info)(buf, start, offset, len, eof, data);
ret = DRM(_histo_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}

View file

@ -303,13 +303,13 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
#define DRM_PROC_LIMIT (PAGE_SIZE-80)
#define DRM_PROC_PRINT(fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) return len;
#define DRM_PROC_PRINT(fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) { *eof = 1; return len - offset; }
#define DRM_PROC_PRINT_RET(ret, fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) { ret; return len; }
#define DRM_PROC_PRINT_RET(ret, fmt, arg...) \
len += sprintf(&buf[len], fmt , ##arg); \
if (len > DRM_PROC_LIMIT) { ret; *eof = 1; return len - offset; }
/* Internal types and structures */
#define DRM_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
@ -701,7 +701,7 @@ extern int drm_proc_cleanup(int minor,
/* Memory management support (memory.c) */
extern void DRM(mem_init)(void);
extern int DRM(mem_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
extern void *DRM(alloc)(size_t size, int area);
extern void *DRM(realloc)(void *oldpt, size_t oldsize, size_t size,
int area);

View file

@ -96,13 +96,19 @@ void DRM(mem_init)(void)
/* drm_mem_info is called whenever a process reads /dev/drm/mem. */
static int DRM(_mem_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data)
int request, int *eof, void *data)
{
drm_mem_stats_t *pt;
int len = 0;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*eof = 0;
*start = &buf[offset];
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
DRM_PROC_PRINT(" total counts "
" | outstanding \n");
DRM_PROC_PRINT("type alloc freed fail bytes freed"
@ -126,7 +132,9 @@ static int DRM(_mem_info)(char *buf, char **start, off_t offset,
- (long)pt->bytes_freed);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
int DRM(mem_info)(char *buf, char **start, off_t offset,

View file

@ -27,28 +27,32 @@
* Authors:
* Rickard E. (Rik) Faith <faith@valinux.com>
* Gareth Hughes <gareth@valinux.com>
*
* Acknowledgements:
* Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
* the problem with the proc files not outputting all their information.
*/
#define __NO_VERSION__
#include "drmP.h"
static int DRM(name_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(vm_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(clients_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(queues_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
static int DRM(bufs_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
#if DRM_DEBUG_CODE
static int DRM(vma_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
#endif
#if DRM_DMA_HISTOGRAM
static int DRM(histo_info)(char *buf, char **start, off_t offset,
int len, int *eof, void *data);
int request, int *eof, void *data);
#endif
struct drm_proc_list {
@ -129,14 +133,19 @@ int DRM(proc_cleanup)(int minor, struct proc_dir_entry *root,
return 0;
}
static int DRM(name_info)(char *buf, char **start, off_t offset, int len,
static int DRM(name_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
if (dev->unique) {
DRM_PROC_PRINT("%s 0x%x %s\n",
@ -144,13 +153,17 @@ static int DRM(name_info)(char *buf, char **start, off_t offset, int len,
} else {
DRM_PROC_PRINT("%s 0x%x\n", dev->name, dev->device);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(_vm_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_vm_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_map_t *map;
/* Hardcoded from _DRM_FRAME_BUFFER,
_DRM_REGISTERS, _DRM_SHM, and
@ -159,9 +172,14 @@ static int DRM(_vm_info)(char *buf, char **start, off_t offset, int len,
const char *type;
int i;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("slot offset size type flags "
"address mtrr\n\n");
for (i = 0; i < dev->map_count; i++) {
@ -182,32 +200,40 @@ static int DRM(_vm_info)(char *buf, char **start, off_t offset, int len,
}
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(vm_info)(char *buf, char **start, off_t offset, int len,
static int DRM(vm_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_vm_info)(buf, start, offset, len, eof, data);
ret = DRM(_vm_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
static int DRM(_queues_info)(char *buf, char **start, off_t offset, int len,
int *eof, void *data)
static int DRM(_queues_info)(char *buf, char **start, off_t offset,
int request, int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
int i;
drm_queue_t *q;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT(" ctx/flags use fin"
" blk/rw/rwf wait flushed queued"
" locks\n\n");
@ -234,17 +260,19 @@ static int DRM(_queues_info)(char *buf, char **start, off_t offset, int len,
atomic_dec(&q->use_count);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(queues_info)(char *buf, char **start, off_t offset, int len,
static int DRM(queues_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_queues_info)(buf, start, offset, len, eof, data);
ret = DRM(_queues_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
@ -252,17 +280,22 @@ static int DRM(queues_info)(char *buf, char **start, off_t offset, int len,
/* drm_bufs_info is called whenever a process reads
/dev/dri/<dev>/bufs. */
static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_device_dma_t *dma = dev->dma;
int i;
if (!dma) return 0;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (!dma || offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT(" o size count free segs pages kB\n\n");
for (i = 0; i <= DRM_MAX_ORDER; i++) {
if (dma->bufs[i].buf_count)
@ -286,31 +319,39 @@ static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int len,
}
DRM_PROC_PRINT("\n");
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(bufs_info)(char *buf, char **start, off_t offset, int len,
static int DRM(bufs_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_bufs_info)(buf, start, offset, len, eof, data);
ret = DRM(_bufs_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
static int DRM(_clients_info)(char *buf, char **start, off_t offset, int len,
int *eof, void *data)
static int DRM(_clients_info)(char *buf, char **start, off_t offset,
int request, int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_file_t *priv;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("a dev pid uid magic ioctls\n\n");
for (priv = dev->file_first; priv; priv = priv->next) {
DRM_PROC_PRINT("%c %3d %5d %5d %10u %10lu\n",
@ -322,17 +363,19 @@ static int DRM(_clients_info)(char *buf, char **start, off_t offset, int len,
priv->ioctl_count);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(clients_info)(char *buf, char **start, off_t offset, int len,
int *eof, void *data)
static int DRM(clients_info)(char *buf, char **start, off_t offset,
int request, int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_clients_info)(buf, start, offset, len, eof, data);
ret = DRM(_clients_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
@ -341,10 +384,11 @@ static int DRM(clients_info)(char *buf, char **start, off_t offset, int len,
#define DRM_VMA_VERBOSE 0
static int DRM(_vma_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_vma_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_vma_entry_t *pt;
struct vm_area_struct *vma;
#if DRM_VMA_VERBOSE
@ -358,9 +402,14 @@ static int DRM(_vma_info)(char *buf, char **start, off_t offset, int len,
unsigned int pgprot;
#endif
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("vma use count: %d, high_memory = %p, 0x%08lx\n",
atomic_read(&dev->vma_count),
high_memory, virt_to_phys(high_memory));
@ -416,17 +465,19 @@ static int DRM(_vma_info)(char *buf, char **start, off_t offset, int len,
#endif
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(vma_info)(char *buf, char **start, off_t offset, int len,
static int DRM(vma_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_vma_info)(buf, start, offset, len, eof, data);
ret = DRM(_vma_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}
@ -434,19 +485,24 @@ static int DRM(vma_info)(char *buf, char **start, off_t offset, int len,
#if DRM_DMA_HISTOGRAM
static int DRM(_histo_info)(char *buf, char **start, off_t offset, int len,
static int DRM(_histo_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int len = 0;
drm_device_dma_t *dma = dev->dma;
int i;
unsigned long slot_value = DRM_DMA_HISTOGRAM_INITIAL;
unsigned long prev_value = 0;
drm_buf_t *buffer;
if (offset > 0) return 0; /* no partial requests */
len = 0;
*eof = 1;
if (offset > DRM_PROC_LIMIT) {
*eof = 1;
return 0;
}
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT("general statistics:\n");
DRM_PROC_PRINT("total %10u\n", atomic_read(&dev->histo.total));
@ -548,17 +604,20 @@ static int DRM(_histo_info)(char *buf, char **start, off_t offset, int len,
prev_value = slot_value;
slot_value = DRM_DMA_HISTOGRAM_NEXT(slot_value);
}
return len;
if (len > request + offset) return request;
*eof = 1;
return len - offset;
}
static int DRM(histo_info)(char *buf, char **start, off_t offset, int len,
static int DRM(histo_info)(char *buf, char **start, off_t offset, int request,
int *eof, void *data)
{
drm_device_t *dev = (drm_device_t *)data;
int ret;
down(&dev->struct_sem);
ret = DRM(_histo_info)(buf, start, offset, len, eof, data);
ret = DRM(_histo_info)(buf, start, offset, request, eof, data);
up(&dev->struct_sem);
return ret;
}