Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e6fe2fb authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Roland Dreier
Browse files

IB/iser: Optimize completion polling



Poll in batch of 16. Since we don't want it on the stack, keep under
iser completion context (iser_comp).

Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent ff3dd52d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -145,6 +145,8 @@
					ISER_MAX_TX_MISC_PDUS         + \
					ISER_MAX_RX_MISC_PDUS)

#define ISER_WC_BATCH_COUNT   16

#define ISER_VER			0x10
#define ISER_WSV			0x08
#define ISER_RSV			0x04
@@ -273,6 +275,7 @@ struct iscsi_iser_task;
 *
 * @device:     pointer to device handle
 * @cq:         completion queue
 * @wcs:        work completion array
 * @tasklet:    Tasklet handle
 * @active_qps: Number of active QPs attached
 *              to completion context
@@ -280,6 +283,7 @@ struct iscsi_iser_task;
struct iser_comp {
	struct iser_device      *device;
	struct ib_cq		*cq;
	struct ib_wc		 wcs[ISER_WC_BATCH_COUNT];
	struct tasklet_struct	 tasklet;
	int                      active_qps;
};
+7 −5
Original line number Diff line number Diff line
@@ -1232,13 +1232,15 @@ static void iser_cq_tasklet_fn(unsigned long data)
{
	struct iser_comp *comp = (struct iser_comp *)data;
	struct ib_cq *cq = comp->cq;
	struct ib_wc wc;
	int completed = 0;
	struct ib_wc *const wcs = comp->wcs;
	int i, n, completed = 0;

	while (ib_poll_cq(cq, 1, &wc) == 1) {
		iser_handle_wc(&wc);
	while ((n = ib_poll_cq(cq, ARRAY_SIZE(comp->wcs), wcs)) > 0) {
		for (i = 0; i < n; i++)
			iser_handle_wc(&wcs[i]);

		if (++completed >= iser_cq_poll_limit)
		completed += n;
		if (completed >= iser_cq_poll_limit)
			break;
	}