LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Kernel (https://www.linuxquestions.org/questions/linux-kernel-70/)
-   -   spinlock semaphore question 2.6.32 mac80211 (https://www.linuxquestions.org/questions/linux-kernel-70/spinlock-semaphore-question-2-6-32-mac80211-835843/)

GurgleSpuge 10-02-2010 04:17 PM

spinlock semaphore question 2.6.32 mac80211
 
Hi,
I am trying to cut in a function in the mac80211 layer in the 2.6.32 kernel and am stuck I was hoping someone can help.

The issue is that I need to call msleep() or schedule() or down() inside multiple layers of existing spinlock and rcu_lock critical sections, when I attempt this I get the "scheduling while atomic" or "scheduling from idle thread" error.

This is using 2.6.32 non-SMP. I have tried both preempt and not preempt as kernel options.

I have read around that if you are non-SMP the spin locks shouldn't do anything and I found an option to let the RCU's be preemptable.

Is there an obvious way to tackle this problem?

I am trying to cut in this fcn :
void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
u8 *data, size_t data_len,
u8 *cdata, u8 *mic)
in

net/mac80211/aes_ccm.c

with a blocking version, without rewriting the kernel

Any help or 411 on spinlocks,interrupts and rcu_locks in the networking layer will help a ton
Thanks

Mara 10-03-2010 02:30 PM

Why do you need to block there? You're running the encryption elsewhere and you need to wait for the result?

GurgleSpuge 10-03-2010 11:10 PM

Exactly, The chip (freescale) has a dedicated encryption co-processor and I have to wait for the result

archieval 10-04-2010 02:53 AM

Why don't you acquire the those locks before this function executes?
Or unlock those locks?
Or just use tasklets or workqueues?

GurgleSpuge 10-04-2010 09:07 PM

archieval thanks for the info,
I am reading up on workqueues and tasklets, I think the workqueue is what I am looking for, (which permits sleeping).

I still cant think of a clever way force a function running in a interrupt context to wait for one in a user context.
You can always split the function up into a top and bottom half, I was just trying to be lazier than that.


All times are GMT -5. The time now is 01:27 AM.