Messages in this thread | | | Date | Tue, 08 Feb 2000 12:25:14 -0600 | From | ejc <> | Subject | [Basics] spinlocks & copy_to_user |
| |
Summary:
What is the Right Way(tm) for a driver (in read(), write(), or ioctl(), etc.) to copy data, possibly modified at interrupt time, to/from a user?
I know this is a fairly basic/fundamental question, but one I haven't found a direct answer to yet. (Point me to docs if you know of any good ones.)
I need to copy information from a kernel memory buffer to a user memory buffer. copy_to_user() is the obvious answer. However, the kernel buffer can be modified at interrupt time (interrupt handler); to protect this, I'm using a spin_lock_irqsave(). But copy_to_user() can sleep. Correct me if I'm wrong, but access_ok() does not appear to worry about the possibility of a fault, just permissions.
I could copy from the kernel buffer to another kernel buffer with irq's disabled, then copy_to_user() from the new buffer, but I was hoping to avoid the additional copy.
I could access each page of the user buffer before taking the spinlock, but will that guarrantee the memory is still there by the time I get to it? Should I copy one page at a time, accessing the page outside of locks and with interrupts enabled each time? Is there a way to verify I won't get put to sleep once interrupts are disabled?
I'm on a UP ARM, but I'd like to know the answer for UP and SMP in any/all archs.
Comments, pointers, and especially answers are most welcome.
(I'm on the list.)
Thank you for your time,
Eli -- Eli Carter eli.carter@inet.com
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |