Commit 650d77c5 authored by Daniel Jurgens's avatar Daniel Jurgens Committed by Paolo Abeni
Browse files

virtio_net: Do DIM update for specified queue only



Since we no longer have to hold the RTNL lock here just do updates for
the specified queue.

Signed-off-by: default avatarDaniel Jurgens <danielj@nvidia.com>
Reviewed-by: default avatarHeng Qi <hengqi@linux.alibaba.com>
Tested-by: default avatarHeng Qi <hengqi@linux.alibaba.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 6f45ab3e
Loading
Loading
Loading
Loading
+15 −25
Original line number Diff line number Diff line
@@ -4383,24 +4383,15 @@ static void virtnet_rx_dim_work(struct work_struct *work)
	struct virtnet_info *vi = rq->vq->vdev->priv;
	struct net_device *dev = vi->dev;
	struct dim_cq_moder update_moder;
	int i, qnum, err;
	int qnum, err;

	if (!rtnl_trylock())
		return;

	/* Each rxq's work is queued by "net_dim()->schedule_work()"
	 * in response to NAPI traffic changes. Note that dim->profile_ix
	 * for each rxq is updated prior to the queuing action.
	 * So we only need to traverse and update profiles for all rxqs
	 * in the work which is holding rtnl_lock.
	 */
	for (i = 0; i < vi->curr_queue_pairs; i++) {
		rq = &vi->rq[i];
		dim = &rq->dim;
	qnum = rq - vi->rq;

	if (!rq->dim_enabled)
			continue;
		goto out;

	update_moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix);
	if (update_moder.usec != rq->intr_coal.max_usecs ||
@@ -4413,8 +4404,7 @@ static void virtnet_rx_dim_work(struct work_struct *work)
				 dev->name, qnum);
		dim->state = DIM_START_MEASURE;
	}
	}

out:
	rtnl_unlock();
}