diff options
author | Keith Whitwell <keith@tungstengraphics.com> | 2005-02-10 11:02:56 +0000 |
---|---|---|
committer | Keith Whitwell <keith@tungstengraphics.com> | 2005-02-10 11:02:56 +0000 |
commit | 08790293b13bb4562307309461400dad22c72eaf (patch) | |
tree | 84d01184e5bcb7e9d77ecf7246562eda8ddde4d7 /shared/radeon_drv.h | |
parent | 2cdfb2cc8527a6a805b159006885268607383448 (diff) |
Stephane's port of Eric's race fix
Diffstat (limited to 'shared/radeon_drv.h')
-rw-r--r-- | shared/radeon_drv.h | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/shared/radeon_drv.h b/shared/radeon_drv.h index f48a95c1..89e68833 100644 --- a/shared/radeon_drv.h +++ b/shared/radeon_drv.h @@ -976,25 +976,26 @@ do { \ } while (0) -#define OUT_RING_USER_TABLE( tab, sz ) do { \ +#define OUT_RING_TABLE( tab, sz ) do { \ int _size = (sz); \ - int __user *_tab = (tab); \ + int *_tab = (int *)(tab); \ \ if (write + _size > mask) { \ - int i = (mask+1) - write; \ - if (DRM_COPY_FROM_USER_UNCHECKED( (int *)(ring+write), \ - _tab, i*4 )) \ - return DRM_ERR(EFAULT); \ + int _i = (mask+1) - write; \ + _size -= _i; \ + while (_i > 0) { \ + *(int *)(ring + write) = *_tab++; \ + write++; \ + _i--; \ + } \ write = 0; \ - _size -= i; \ - _tab += i; \ + _tab += _i; \ + } \ + while (_size > 0) { \ + *(ring + write) = *_tab++; \ + write++; \ + _size--; \ } \ - \ - if (_size && DRM_COPY_FROM_USER_UNCHECKED( (int *)(ring+write), \ - _tab, _size*4 )) \ - return DRM_ERR(EFAULT); \ - \ - write += _size; \ write &= mask; \ } while (0) |