dmaengine: idxd: wq size configuration needs to check global max size
The current size_store() function for idxd sysfs does not check the total
wq size. This allows configuration of all wqs with total wq size. Add check
to make sure the wq sysfs attribute rejects storing of size over the total
wq size.
Fixes: c52ca47823
("dmaengine: idxd: add configuration component of driver")
Reported-by: Jerry Chen <jerry.t.chen@intel.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/158213309629.2509.3583411832507185041.stgit@djiang5-desk3.ch.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
88402c5b1b
commit
50e7e7f6f2
|
@ -904,6 +904,20 @@ static ssize_t wq_size_show(struct device *dev, struct device_attribute *attr,
|
|||
return sprintf(buf, "%u\n", wq->size);
|
||||
}
|
||||
|
||||
static int total_claimed_wq_size(struct idxd_device *idxd)
|
||||
{
|
||||
int i;
|
||||
int wq_size = 0;
|
||||
|
||||
for (i = 0; i < idxd->max_wqs; i++) {
|
||||
struct idxd_wq *wq = &idxd->wqs[i];
|
||||
|
||||
wq_size += wq->size;
|
||||
}
|
||||
|
||||
return wq_size;
|
||||
}
|
||||
|
||||
static ssize_t wq_size_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
|
@ -923,7 +937,7 @@ static ssize_t wq_size_store(struct device *dev,
|
|||
if (wq->state != IDXD_WQ_DISABLED)
|
||||
return -EPERM;
|
||||
|
||||
if (size > idxd->max_wq_size)
|
||||
if (size + total_claimed_wq_size(idxd) - wq->size > idxd->max_wq_size)
|
||||
return -EINVAL;
|
||||
|
||||
wq->size = size;
|
||||
|
|
Loading…
Reference in New Issue