[Basics] spinlocks & copy_to_user

From: ejc (eli.carter@inet.com)
Date: Tue Feb 08 2000 - 13:25:14 EST


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/



This archive was generated by hypermail 2b29 : Tue Feb 15 2000 - 21:00:13 EST