[ofa-general] [PATCH 5/5] nes: napi interface fix
Sean Hefty
sean.hefty at intel.com
Fri Nov 30 10:50:23 PST 2007
>--- a/drivers/infiniband/hw/nes/nes_hw.c
>+++ b/drivers/infiniband/hw/nes/nes_hw.c
>@@ -1232,6 +1232,12 @@ static void nes_replenish_nic_rq(struct nes_vnic
>*nesvnic)
> nesnic = &nesvnic->nic;
> nesdev = nesvnic->nesdev;
> spin_lock_irqsave(&nesnic->rq_lock, flags);
>+ if (nesnic->replenishing_rq !=0) {
>+ spin_unlock_irqrestore(&nesnic->rq_lock, flags);
>+ return;
>+ }
>+ nesnic->replenishing_rq = 1;
>+ spin_unlock_irqrestore(&nesnic->rq_lock, flags);
> do {
> skb = dev_alloc_skb(nesvnic->max_frame_size);
> if (skb) {
>@@ -1275,7 +1281,7 @@ static void nes_replenish_nic_rq(struct nes_vnic
>*nesvnic)
> if (rx_wqes_posted) {
> nes_write32(nesdev->regs+NES_WQE_ALLOC, (rx_wqes_posted << 24) |
>nesnic->qp_id);
> }
>- spin_unlock_irqrestore(&nesnic->rq_lock, flags);
>+ nesnic->replenishing_rq = 0;
It seems racy that this is set under lock, but cleared without the lock held.
How do you ensure that the nic_rq will always be replenished?
>@@ -2314,11 +2313,11 @@ void nes_nic_ce_handler(struct nes_device *nesdev,
>struct nes_hw_nic_cq *cq)
> cqe_count = 0;
> }
> #ifdef NES_NAPI
Is #ifdef napi sprinkled throughout the code common for most drivers? Is there
a better way to handle this? (Is this OFED only for backports, or for
upstream?)
>@@ -361,6 +361,7 @@ enum nes_cqe_opcode_bits {
> NES_CQE_VALID = (1<<31),
> };
>
>+
> enum nes_cqe_word_idx {
> NES_CQE_PAYLOAD_LENGTH_IDX = 0,
> NES_CQE_COMP_COMP_CTX_LOW_IDX = 2,
>@@ -810,6 +811,7 @@ struct nes_hw_aeqe {
> __le32 aeqe_words[4];
> };
>
>+
couple extra blank lines were added
> struct nes_cqp_request {
> wait_queue_head_t waitq;
> struct nes_hw_cqp_wqe cqp_wqe;
>@@ -857,6 +859,8 @@ struct nes_hw_nic {
> u16 rq_head;
> u16 rq_tail;
> u16 rq_size;
>+ u8 replenishing_rq;
>+ u8 reserved;
Why is reserved added?
- Sean
More information about the general
mailing list