On 1 Dec 2002, Michel Dänzer wrote:
> 
> Actually, I did that because I thought send_sig_info() or kfree() might
> not be interrupt safe.

Signals are commonly sent from interrupts: kill_fasync() is quite commonly 
supported by many device drivers, and the resulting SIGIO is almost 
universally sent from an interrupt handler.

Memory freeing is also fine - it's only _allocation_ that is frowned upon
(you can do it, using GFP_ATOMIC, but it's usually a really bad idea. Most 
useful for things like network drivers where the loss of a packet due to 
out-of-memory conditions is acceptable).

> Does that also apply to kmalloc()/kfree(), or are they safe?

kfree() (or free_pages() or others of that type) is always safe.  
kmalloc(x, GFP_ATOMIC) works, but has problems (ie being over-eager about 
using it can easily result in a system that just dies from being out of 
memory and not being able to do the required memory balancing and 
swap-out to replenish it).

The attached patch looked mostly ok, except this part:

        -       sema_init( &dev->vbl_sem, 0 );
        +       spin_lock_irqsave( &dev->vbl_lock, flags );
        ..

should almost certainly have been a

                spin_lock_init(&dev->vbl_lock);

instead of locking and unlocking an uninitialized variable (from what I 
could tell from just reading the diff).

Btw, from a testing standpoint it's then also worthwhile compiling with 
CONFIG_DEBUG_SPINLOCK, which will verify that spinlocks are initialized 
etc.

                Linus



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Dri-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to