mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 22:59:29 +02:00
thunderbolt: Clamp DMA tunnel credits to what a hop register can hold
struct tb_regs_hop::initial_credits is 7 bits wide, but neither of the values tb_tunnel_alloc_dma() picks from is bounded by that: the dma_credits module parameter has no upper limit, and neither does the host router's baMaxHI. A larger count survives until tb_path_activate() copies it into the register and keeps the low bits, leaving the path on a credit count nobody asked for. Clamp it in tb_tunnel_alloc_dma(), the only entry point for DMA tunnels; every step below it can only lower the value further. Carry the count in an unsigned int while at it. Assisted-by: Claude:claude-opus-5 Signed-off-by: Fan Ye <fy15309206903@gmail.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
@@ -48,6 +48,9 @@
|
||||
#define TB_DP_AUX_PRIORITY 2
|
||||
#define TB_DP_AUX_WEIGHT 1
|
||||
|
||||
/* struct tb_regs_hop::initial_credits is 7 bits wide */
|
||||
#define TB_MAX_CREDITS 127
|
||||
|
||||
/* Minimum number of credits needed for PCIe path */
|
||||
#define TB_MIN_PCIE_CREDITS 6U
|
||||
/*
|
||||
@@ -1907,7 +1910,7 @@ struct tb_tunnel *tb_tunnel_alloc_dma(struct tb *tb, struct tb_port *nhi,
|
||||
struct tb_tunnel *tunnel;
|
||||
size_t npaths = 0, i = 0;
|
||||
struct tb_path *path;
|
||||
int credits;
|
||||
unsigned int credits;
|
||||
|
||||
/* Ring 0 is reserved for control channel */
|
||||
if (WARN_ON(!receive_ring || !transmit_ring))
|
||||
@@ -1930,6 +1933,11 @@ struct tb_tunnel *tb_tunnel_alloc_dma(struct tb *tb, struct tb_port *nhi,
|
||||
tunnel->destroy = tb_dma_destroy;
|
||||
|
||||
credits = min_not_zero(dma_credits, nhi->sw->max_dma_credits);
|
||||
if (credits > TB_MAX_CREDITS) {
|
||||
tb_tunnel_dbg(tunnel, "%u credits do not fit a hop, using %u\n",
|
||||
credits, TB_MAX_CREDITS);
|
||||
credits = TB_MAX_CREDITS;
|
||||
}
|
||||
|
||||
if (receive_ring > 0) {
|
||||
path = tb_path_alloc(tb, dst, receive_path, nhi, receive_ring, 0,
|
||||
|
||||
Reference in New Issue
Block a user