|
@@ -983,10 +983,9 @@ static int rdtgroup_mode_show(struct kernfs_open_file *of,
|
|
|
* If a CDP peer was found, @r_cdp will point to the peer RDT resource
|
|
|
* and @d_cdp will point to the peer RDT domain.
|
|
|
*/
|
|
|
-static int __attribute__((unused)) rdt_cdp_peer_get(struct rdt_resource *r,
|
|
|
- struct rdt_domain *d,
|
|
|
- struct rdt_resource **r_cdp,
|
|
|
- struct rdt_domain **d_cdp)
|
|
|
+static int rdt_cdp_peer_get(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
+ struct rdt_resource **r_cdp,
|
|
|
+ struct rdt_domain **d_cdp)
|
|
|
{
|
|
|
struct rdt_resource *_r_cdp = NULL;
|
|
|
struct rdt_domain *_d_cdp = NULL;
|
|
@@ -1033,7 +1032,7 @@ out:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * rdtgroup_cbm_overlaps - Does CBM for intended closid overlap with other
|
|
|
+ * __rdtgroup_cbm_overlaps - Does CBM for intended closid overlap with other
|
|
|
* @r: Resource to which domain instance @d belongs.
|
|
|
* @d: The domain instance for which @closid is being tested.
|
|
|
* @cbm: Capacity bitmask being tested.
|
|
@@ -1052,8 +1051,8 @@ out:
|
|
|
*
|
|
|
* Return: false if CBM does not overlap, true if it does.
|
|
|
*/
|
|
|
-bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
- unsigned long cbm, int closid, bool exclusive)
|
|
|
+static bool __rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
+ unsigned long cbm, int closid, bool exclusive)
|
|
|
{
|
|
|
enum rdtgrp_mode mode;
|
|
|
unsigned long ctrl_b;
|
|
@@ -1088,6 +1087,41 @@ bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * rdtgroup_cbm_overlaps - Does CBM overlap with other use of hardware
|
|
|
+ * @r: Resource to which domain instance @d belongs.
|
|
|
+ * @d: The domain instance for which @closid is being tested.
|
|
|
+ * @cbm: Capacity bitmask being tested.
|
|
|
+ * @closid: Intended closid for @cbm.
|
|
|
+ * @exclusive: Only check if overlaps with exclusive resource groups
|
|
|
+ *
|
|
|
+ * Resources that can be allocated using a CBM can use the CBM to control
|
|
|
+ * the overlap of these allocations. rdtgroup_cmb_overlaps() is the test
|
|
|
+ * for overlap. Overlap test is not limited to the specific resource for
|
|
|
+ * which the CBM is intended though - when dealing with CDP resources that
|
|
|
+ * share the underlying hardware the overlap check should be performed on
|
|
|
+ * the CDP resource sharing the hardware also.
|
|
|
+ *
|
|
|
+ * Refer to description of __rdtgroup_cbm_overlaps() for the details of the
|
|
|
+ * overlap test.
|
|
|
+ *
|
|
|
+ * Return: true if CBM overlap detected, false if there is no overlap
|
|
|
+ */
|
|
|
+bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
|
|
|
+ unsigned long cbm, int closid, bool exclusive)
|
|
|
+{
|
|
|
+ struct rdt_resource *r_cdp;
|
|
|
+ struct rdt_domain *d_cdp;
|
|
|
+
|
|
|
+ if (__rdtgroup_cbm_overlaps(r, d, cbm, closid, exclusive))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if (rdt_cdp_peer_get(r, d, &r_cdp, &d_cdp) < 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return __rdtgroup_cbm_overlaps(r_cdp, d_cdp, cbm, closid, exclusive);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* rdtgroup_mode_test_exclusive - Test if this resource group can be exclusive
|
|
|
*
|