Hi, ALl:
   When I add the hardware device driver for crypto, i get the bellow
error information. My kernel is 2.6.26

[  319.938873] BUG: scheduling while atomic: kcryptd/3676/0x00000002
[  319.938920] Pid: 3676, comm: kcryptd Tainted: P          2.6.26-2-amd64 #1
[  319.938922]
[  319.938922] Call Trace:
[  319.938926]  [<ffffffff80427cd4>] schedule+0x95/0x635
[  319.938934]  [<ffffffffa0eb629b>] :libfpga:fpga_dma_open+0xa5/0xab
[  319.938941]  [<ffffffffa0eb67ea>] :libfpga:fpga_dma_block_read+0x12b/0x167
[  319.938945]  [<ffffffff802461c5>] autoremove_wake_function+0x0/0x2e
[  319.938954]  [<ffffffffa039a248>] :dsi_aes:dsi_aes_crypt+0x1db/0x24b
[  319.938960]  [<ffffffffa03a832a>] :cbc:crypto_cbc_encrypt+0xe6/0x138
[  319.938964]  [<ffffffffa039e043>] :aes_generic:aes_encrypt+0x0/0x21
[  319.938980]  [<ffffffffa0384f6f>] :crypto_blkcipher:async_encrypt+0x35/0x3a
[  319.938986]  [<ffffffffa03eea0b>] :dm_crypt:crypt_convert+0x1de/0x261
[  319.938995]  [<ffffffffa03eec6e>] :dm_crypt:kcryptd_crypt+0x1e0/0x2c5
[  319.939007]  [<ffffffffa03eea8e>] :dm_crypt:kcryptd_crypt+0x0/0x2c5
[  319.939012]  [<ffffffff802430c8>] run_workqueue+0x82/0x111
[  319.939016]  [<ffffffff80243995>] worker_thread+0xd5/0xe0
[  319.939019]  [<ffffffff802461c5>] autoremove_wake_function+0x0/0x2e
[  319.939024]  [<ffffffff802438c0>] worker_thread+0x0/0xe0
[  319.939026]  [<ffffffff8024609f>] kthread+0x47/0x74
[  319.939030]  [<ffffffff8020cf28>] child_rip+0xa/0x12
[  319.939041]  [<ffffffff80246058>] kthread+0x0/0x74
[  319.939043]  [<ffffffff8020cf1e>] child_rip+0x0/0x12

I think it is happed when calling the
wait_event_interruptible(fdev->wait) routine, but i don't know how to
fix it. Hope can get you help. Thanks!

The encryption calling tree and irq handler tree showed in bellow

/* ecryption callint tree */
aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|-->dsi_aes_crypt((unsigned int *)in, (unsigned int *) out);
   |-->do_crypt
      |-->down_interruptible(&fpga->sem)
           fpga_dma_block_write()
           |--> fpga_dma_block_transfer(base, pcie_addr, local_addr,
size, flag | FPGA_DMA_READ_FLAG); /*write data to hardware */
                |-->wait_event_interruptible(fdev->wait) /* waiting event*/
          up()

/* interrupt calling tree */
pci_fpga_handler(int irq, void *arg)
|-->schedule_work(&fpga.work);
   |-->fpga_work_task(struct work_struct *work)
        |--> spin_lock()         /*lock*/
               wake_up_interruptible(&fpga.wait); /**/
               spin_unlock_irqrestore(&fpga.lock, flags);

The fpga.work and fpga.wait define is

    init_waitqueue_head(&fpga.wait);
    INIT_WORK(&fpga.work, fpga_work_task);


Best Regards

Bai Shuwei

-- 
Love other people, as same as love yourself!
Don't think all the time, do it by your hands!

E-Mail: baishu...@gmail.com
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to