[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: spinlock protection on data question
On Wednesday 07 August 2002 03:30 pm, anton wilson wrote:
> On Wednesday 07 August 2002 10:57 pm, Sumit Agarwal wrote:
> > I dont know the context of the problem.
> >
> > If there is no lock for the above structure, try using the
> > usage or
> > count field to know, if the data is in use.
> >
> > If you want more details, can you repost the question?
>
> I have a array of data that is used globally and an array of locks to
> protect them.
>
> struct context_data data[10];
> spinlock_t locks[10];
>
>
> The problem I'm having is that to find out which spinlock to use to lock
> any struct in that array, I have to first access the data like this:
>
> num = mydata->num;
> spin_lock_irqaave( &locks[num], &flags);
>
>
> but one of my driver functions frees that same data:
>
> static void disconnect_rasid(struct usb_device *dev, void *drv_context)
> {
> num = ((context_data *) drv_context)->num;
> spin_lock_irqaave( &locks[num], &flags);
>
> kfree(drv_context);
>
> /* .... */
>
> }
>
> so i think that any other function that uses that data is going to have
> problems if it is called at the same time as disconnect because, before it
> can lock the data structure, it has to access the data structure to find
> out where in the array of locks the spinlock is .. . if disconnect has
> freed that data structure, it no longer exists and you're accessing a null
> pointer.
>
> Any suggestions?
>
>
> Anton
Change the structure to
struct{
context_data_stuff *data;
spinlock_t spin_lock;
} context_data
and only free the data inside the struct.
--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive: http://mail.nl.linux.org/kernelnewbies/
FAQ: http://kernelnewbies.org/faq/