Linux-kernel mailing list archive 2000-06,: [Basics] spinlocks & copy_to_user

# [Basics] spinlocks & copy_to_user

ejc (eli.carter@inet.com)
Tue, 08 Feb 2000 12:25:14 -0600

- Messages sorted by: [ date ][ thread ][ subject ][ author ]
- Next message: Q: "Oops with 2.3.42"
- Previous message: iafilius@xs4all.nl: "Re: [rfc][patchlet] initrd fix 2.3.39 (works for pre2-2.3.43)"
- Next in thread: Linus Torvalds: "Re: [Basics] spinlocks & copy_to_user"
- Reply: Linus Torvalds: "Re: [Basics] spinlocks & copy_to_user"
- Reply: ejc: "Re: [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/

- Next message: Q: "Oops with 2.3.42"
- Previous message: iafilius@xs4all.nl: "Re: [rfc][patchlet] initrd fix 2.3.39 (works for pre2-2.3.43)"
- Next in thread: Linus Torvalds: "Re: [Basics] spinlocks & copy_to_user"
- Reply: Linus Torvalds: "Re: [Basics] spinlocks & copy_to_user"
- Reply: ejc: "Re: [Basics] spinlocks & copy_to_user"