On 2019/2/1 13:22, Herbert Xu wrote: > On Wed, Jan 23, 2019 at 09:08:51PM +0800, Zhou Wang wrote: >> >> +/** >> + * hisi_qp_poll() - Poll current cqe to see if a task is finished. >> + * @qp: The qp which will poll. >> + * >> + * This function polls current cqe for a give qp to see if a task is finished. >> + * Return -ETIME if timeout. >> + */ >> +int hisi_qp_poll(struct hisi_qp *qp) >> +{ >> + struct qm_cqe *cqe = qp->cqe + qp->qp_status.cq_head; >> + struct qm_cqc *cqc = qp->cqc; >> + int retries = 1000; >> + >> + while (!(QM_CQE_PHASE(cqe) == (cqc->dw6 & 0x1))) { >> + dma_rmb(); >> + if (!--retries) { >> + dev_err(&qp->qm->pdev->dev, "Poll cqe failed!\n"); >> + return -ETIME; >> + } >> + udelay(10); >> + } >> + >> + qm_cq_head_update(qp); >> + atomic_dec(&qp->qp_status.used); >> + >> + qm_db(qp->qm, qp->qp_id, QM_DOORBELL_CMD_CQ, qp->qp_status.cq_head, 0); >> + /* set c_flag */ >> + qm_db(qp->qm, qp->qp_id, QM_DOORBELL_CMD_CQ, qp->qp_status.cq_head, 1); >> + >> + return 0; >> +} >> +EXPORT_SYMBOL_GPL(hisi_qp_poll); > > Polling in softirq context is unacceptable. Can't your hardware > send interrupts to signal completion? What is the average speed > of processing a single 1500-byte packet on your hardware? Our hardware supports interrupt. In fact, implementation of compress/decompress interface of crypto_alg in v1 was done using interrupt: compress/decompress: send task to hardware wait task finished(wait_for_completion_timeout) In irq handler: complete However, there is get_cpu/put_cpu in scomp, wait and complete in above has to be changed to poll: compress/decompress: send task to hardware check if task is finished The average speed of this zip engine is 7.5GB/s, so it will take about 0.2us to process 1500B. Best, Zhou > > Cheers, >