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 |
Why do you need to block there? You're running the encryption elsewhere and you need to wait for the result?
|
Exactly, The chip (freescale) has a dedicated encryption co-processor and I have to wait for the result
|
Why don't you acquire the those locks before this function executes?
Or unlock those locks? Or just use tasklets or workqueues? |
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. |