diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 17d084af..0b00628f 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -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); diff --git a/linux-core/drm_memory.h b/linux-core/drm_memory.h index 9dcd9d9a..672724a6 100644 --- a/linux-core/drm_memory.h +++ b/linux-core/drm_memory.h @@ -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, diff --git a/linux-core/drm_proc.c b/linux-core/drm_proc.c index 0467f89f..bbd38f76 100644 --- a/linux-core/drm_proc.c +++ b/linux-core/drm_proc.c @@ -27,28 +27,32 @@ * Authors: * Rickard E. (Rik) Faith * Gareth Hughes + * + * Acknowledgements: + * Matthew J Sottek 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//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; } diff --git a/linux/drmP.h b/linux/drmP.h index 17d084af..0b00628f 100644 --- a/linux/drmP.h +++ b/linux/drmP.h @@ -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); diff --git a/linux/drm_memory.h b/linux/drm_memory.h index 9dcd9d9a..672724a6 100644 --- a/linux/drm_memory.h +++ b/linux/drm_memory.h @@ -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, diff --git a/linux/drm_proc.h b/linux/drm_proc.h index 0467f89f..bbd38f76 100644 --- a/linux/drm_proc.h +++ b/linux/drm_proc.h @@ -27,28 +27,32 @@ * Authors: * Rickard E. (Rik) Faith * Gareth Hughes + * + * Acknowledgements: + * Matthew J Sottek 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//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; }