Re: RFC: i386: kill !4KSTACKS

From: Daniel Phillips
Date: Tue Sep 06 2005 - 23:15:17 EST


On Tuesday 06 September 2005 21:59, Mark Lord wrote:
> Daniel Phillips wrote:
> > There are only two stacks involved, the normal kernel stack and your new
> > ndis stack. You save ESP of the kernel stack at the base of the ndis
> > stack. When the Windows code calls your api, you get the ndis ESP, load
> > the kernel ESP from the base of the ndis stack, push the ndis ESP so you
> > can get back to the ndis code later, and continue on your merry way.

I must have been smoking something when I convinced myself that the driver
can't call into the kernel without switching back to the kernel stack. But
this is wrong, as long as ->task and ->previous_esp are initialized, staying
on the bigger stack looks fine (previous_esp is apparently used only for
backtrace).

> With CONFIG_PREEMPT, this will still cause trouble due to lack
> of "current" task info on the NDIS stack.
>
> One option is to copy (duplicate) the bottom-of-stack info when
> switching to the NDIS stack.

Yes, just like do_IRQ.

> Another option is to stick a Mutex around any use of the NDIS stack
> when calling into the foreign driver (might be done like this already??),

There is no mutex now, but this is the easy way to get by with just one ndis
stack.

> which will prevent PREEMPTion during the call.

We have preempt_enable/disable for that. But I am not sure preemption needs
to be disabled.

Regards,

Daniel
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/