mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 21:45:45 +02:00
cxlflash: Move to exponential back-off when cmd_room is not available
[ Upstream commit ea76543127 ]
While profiling the cxlflash_queuecommand() path under a heavy load it
was found that number of retries to find cmd_room was fairly high.
There are two problems with the current back-off:
a) It starts with a udelay of 0
b) It backs-off linearly
Tried several approaches (a higher multiple 10*n, 100*n, as well as n^2,
2^n) and found that the exponential back-off(2^n) approach had the least
overall cost. Cost as being defined as overall time spent waiting.
The fix is to change the linear back-off to an exponential back-off.
This solution also takes care of the problem with the initial
delay (starts with 1 usec).
Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>
Acked-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
61610c63fa
commit
d4009e4b6e
|
|
@ -289,7 +289,7 @@ static void context_reset(struct afu_cmd *cmd)
|
|||
atomic64_set(&afu->room, room);
|
||||
if (room)
|
||||
goto write_rrin;
|
||||
udelay(nretry);
|
||||
udelay(1 << nretry);
|
||||
} while (nretry++ < MC_ROOM_RETRY_CNT);
|
||||
|
||||
pr_err("%s: no cmd_room to send reset\n", __func__);
|
||||
|
|
@ -303,7 +303,7 @@ static void context_reset(struct afu_cmd *cmd)
|
|||
if (rrin != 0x1)
|
||||
break;
|
||||
/* Double delay each time */
|
||||
udelay(2 << nretry);
|
||||
udelay(1 << nretry);
|
||||
} while (nretry++ < MC_ROOM_RETRY_CNT);
|
||||
}
|
||||
|
||||
|
|
@ -338,7 +338,7 @@ static int send_cmd(struct afu *afu, struct afu_cmd *cmd)
|
|||
atomic64_set(&afu->room, room);
|
||||
if (room)
|
||||
goto write_ioarrin;
|
||||
udelay(nretry);
|
||||
udelay(1 << nretry);
|
||||
} while (nretry++ < MC_ROOM_RETRY_CNT);
|
||||
|
||||
dev_err(dev, "%s: no cmd_room to send 0x%X\n",
|
||||
|
|
@ -352,7 +352,7 @@ static int send_cmd(struct afu *afu, struct afu_cmd *cmd)
|
|||
* afu->room.
|
||||
*/
|
||||
if (nretry++ < MC_ROOM_RETRY_CNT) {
|
||||
udelay(nretry);
|
||||
udelay(1 << nretry);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user