summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2017-08-03 14:16:31 +0000
committerhselasky <hselasky@FreeBSD.org>2017-08-03 14:16:31 +0000
commit81ace7abd6ea55aa7b90caec09e6c916ede9645a (patch)
tree43ec9155ab0bd4ef3af8203ec76a55d346bc05c1
parent49d44a4c7da3d59acf273f4cd73d3a16f1cebfbf (diff)
downloadFreeBSD-src-81ace7abd6ea55aa7b90caec09e6c916ede9645a.zip
FreeBSD-src-81ace7abd6ea55aa7b90caec09e6c916ede9645a.tar.gz
MFC r312876:
Use ffs() to scan for first bit instead of using a for() loop. Minor code refactor while at it. Sponsored by: Mellanox Technologies
-rw-r--r--sys/dev/mlx5/driver.h2
-rw-r--r--sys/dev/mlx5/mlx5_core/mlx5_cmd.c101
2 files changed, 53 insertions, 50 deletions
diff --git a/sys/dev/mlx5/driver.h b/sys/dev/mlx5/driver.h
index 5a6c287..6a408df 100644
--- a/sys/dev/mlx5/driver.h
+++ b/sys/dev/mlx5/driver.h
@@ -859,7 +859,7 @@ void mlx5_cq_completion(struct mlx5_core_dev *dev, u32 cqn);
void mlx5_rsc_event(struct mlx5_core_dev *dev, u32 rsn, int event_type);
void mlx5_srq_event(struct mlx5_core_dev *dev, u32 srqn, int event_type);
struct mlx5_core_srq *mlx5_core_get_srq(struct mlx5_core_dev *dev, u32 srqn);
-void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector);
+void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u32 vector);
void mlx5_cq_event(struct mlx5_core_dev *dev, u32 cqn, int event_type);
int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
int nent, u64 mask, const char *name, struct mlx5_uar *uar);
diff --git a/sys/dev/mlx5/mlx5_core/mlx5_cmd.c b/sys/dev/mlx5/mlx5_core/mlx5_cmd.c
index 6d6e036..7d89742 100644
--- a/sys/dev/mlx5/mlx5_core/mlx5_cmd.c
+++ b/sys/dev/mlx5/mlx5_core/mlx5_cmd.c
@@ -760,7 +760,7 @@ static void cmd_work_handler(struct work_struct *work)
poll_timeout(ent);
/* make sure we read the descriptor after ownership is SW */
rmb();
- mlx5_cmd_comp_handler(dev, 1UL << ent->idx);
+ mlx5_cmd_comp_handler(dev, 1U << ent->idx);
}
}
@@ -1104,7 +1104,7 @@ static void free_msg(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *msg)
}
}
-void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector)
+void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u32 vector)
{
struct mlx5_cmd *cmd = &dev->cmd;
struct mlx5_cmd_work_ent *ent;
@@ -1112,60 +1112,63 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector)
void *context;
int err;
int i;
+ struct semaphore *sem;
s64 ds;
struct mlx5_cmd_stats *stats;
unsigned long flags;
- for (i = 0; i < (1 << cmd->log_sz); i++) {
- if (test_bit(i, &vector)) {
- struct semaphore *sem;
-
- ent = cmd->ent_arr[i];
- if (ent->page_queue)
- sem = &cmd->pages_sem;
+ while (vector != 0) {
+ i = ffs(vector) - 1;
+ vector &= ~(1U << i);
+ ent = cmd->ent_arr[i];
+ if (ent->page_queue)
+ sem = &cmd->pages_sem;
+ else
+ sem = &cmd->sem;
+ ent->ts2 = ktime_get_ns();
+ memcpy(ent->out->first.data, ent->lay->out,
+ sizeof(ent->lay->out));
+ dump_command(dev, ent, 0);
+ if (!ent->ret) {
+ if (!cmd->checksum_disabled)
+ ent->ret = verify_signature(ent);
else
- sem = &cmd->sem;
- ent->ts2 = ktime_get_ns();
- memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out));
- dump_command(dev, ent, 0);
- if (!ent->ret) {
- if (!cmd->checksum_disabled)
- ent->ret = verify_signature(ent);
- else
- ent->ret = 0;
- ent->status = ent->lay->status_own >> 1;
- mlx5_core_dbg(dev, "command completed. ret 0x%x, delivery status %s(0x%x)\n",
- ent->ret, deliv_status_to_str(ent->status), ent->status);
- }
- free_ent(cmd, ent->idx);
- if (ent->callback) {
- ds = ent->ts2 - ent->ts1;
- if (ent->op < ARRAY_SIZE(cmd->stats)) {
- stats = &cmd->stats[ent->op];
- spin_lock_irqsave(&stats->lock, flags);
- stats->sum += ds;
- ++stats->n;
- spin_unlock_irqrestore(&stats->lock, flags);
- }
-
- callback = ent->callback;
- context = ent->context;
- err = ent->ret;
- if (!err)
- err = mlx5_copy_from_msg(ent->uout,
- ent->out,
- ent->uout_size);
-
- mlx5_free_cmd_msg(dev, ent->out);
- free_msg(dev, ent->in);
-
- free_cmd(ent);
- callback(err, context);
- } else {
- complete(&ent->done);
+ ent->ret = 0;
+ ent->status = ent->lay->status_own >> 1;
+ mlx5_core_dbg(dev,
+ "FW command ret 0x%x, status %s(0x%x)\n",
+ ent->ret,
+ deliv_status_to_str(ent->status),
+ ent->status);
+ }
+ free_ent(cmd, ent->idx);
+ if (ent->callback) {
+ ds = ent->ts2 - ent->ts1;
+ if (ent->op < ARRAY_SIZE(cmd->stats)) {
+ stats = &cmd->stats[ent->op];
+ spin_lock_irqsave(&stats->lock, flags);
+ stats->sum += ds;
+ ++stats->n;
+ spin_unlock_irqrestore(&stats->lock, flags);
}
- up(sem);
+
+ callback = ent->callback;
+ context = ent->context;
+ err = ent->ret;
+ if (!err)
+ err = mlx5_copy_from_msg(ent->uout,
+ ent->out,
+ ent->uout_size);
+
+ mlx5_free_cmd_msg(dev, ent->out);
+ free_msg(dev, ent->in);
+
+ free_cmd(ent);
+ callback(err, context);
+ } else {
+ complete(&ent->done);
}
+ up(sem);
}
}
EXPORT_SYMBOL(mlx5_cmd_comp_handler);
OpenPOWER on IntegriCloud