mirror of https://gitee.com/openkylin/linux.git
nfp: fix invalid area detection
Core should detect when someone is trying to request an access window which is too large for a given type of access. Otherwise the requester will be put on a wait queue for ever without any error message. Add const qualifiers to clarify that we are only looking at read- -only members in relevant functions. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
76e8f93e89
commit
1bb665e3dd
|
@ -217,7 +217,7 @@ static resource_size_t nfp_bar_resource_start(struct nfp_bar *bar)
|
|||
#define TARGET_WIDTH_64 8
|
||||
|
||||
static int
|
||||
compute_bar(struct nfp6000_pcie *nfp, struct nfp_bar *bar,
|
||||
compute_bar(const struct nfp6000_pcie *nfp, const struct nfp_bar *bar,
|
||||
u32 *bar_config, u64 *bar_base,
|
||||
int tgt, int act, int tok, u64 offset, size_t size, int width)
|
||||
{
|
||||
|
@ -410,35 +410,36 @@ find_matching_bar(struct nfp6000_pcie *nfp,
|
|||
|
||||
/* Return EAGAIN if no resource is available */
|
||||
static int
|
||||
find_unused_bar_noblock(struct nfp6000_pcie *nfp,
|
||||
find_unused_bar_noblock(const struct nfp6000_pcie *nfp,
|
||||
int tgt, int act, int tok,
|
||||
u64 offset, size_t size, int width)
|
||||
{
|
||||
int n, invalid = 0;
|
||||
int n, busy = 0;
|
||||
|
||||
for (n = 0; n < nfp->bars; n++) {
|
||||
struct nfp_bar *bar = &nfp->bar[n];
|
||||
const struct nfp_bar *bar = &nfp->bar[n];
|
||||
int err;
|
||||
|
||||
if (bar->bitsize == 0) {
|
||||
invalid++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (atomic_read(&bar->refcnt) != 0)
|
||||
if (!bar->bitsize)
|
||||
continue;
|
||||
|
||||
/* Just check to see if we can make it fit... */
|
||||
err = compute_bar(nfp, bar, NULL, NULL,
|
||||
tgt, act, tok, offset, size, width);
|
||||
if (err)
|
||||
continue;
|
||||
|
||||
if (err < 0)
|
||||
invalid++;
|
||||
else
|
||||
if (!atomic_read(&bar->refcnt))
|
||||
return n;
|
||||
|
||||
busy++;
|
||||
}
|
||||
|
||||
return (n == invalid) ? -EINVAL : -EAGAIN;
|
||||
if (WARN(!busy, "No suitable BAR found for request tgt:0x%x act:0x%x tok:0x%x off:0x%llx size:%zd width:%d\n",
|
||||
tgt, act, tok, offset, size, width))
|
||||
return -EINVAL;
|
||||
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
Loading…
Reference in New Issue