|
@@ -960,6 +960,78 @@ static int rdtgroup_mode_show(struct kernfs_open_file *of,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * rdt_cdp_peer_get - Retrieve CDP peer if it exists
|
|
|
+ * @r: RDT resource to which RDT domain @d belongs
|
|
|
+ * @d: Cache instance for which a CDP peer is requested
|
|
|
+ * @r_cdp: RDT resource that shares hardware with @r (RDT resource peer)
|
|
|
+ * Used to return the result.
|
|
|
+ * @d_cdp: RDT domain that shares hardware with @d (RDT domain peer)
|
|
|
+ * Used to return the result.
|
|
|
+ *
|
|
|
+ * RDT resources are managed independently and by extension the RDT domains
|
|
|
+ * (RDT resource instances) are managed independently also. The Code and
|
|
|
+ * Data Prioritization (CDP) RDT resources, while managed independently,
|
|
|
+ * could refer to the same underlying hardware. For example,
|
|
|
+ * RDT_RESOURCE_L2CODE and RDT_RESOURCE_L2DATA both refer to the L2 cache.
|
|
|
+ *
|
|
|
+ * When provided with an RDT resource @r and an instance of that RDT
|
|
|
+ * resource @d rdt_cdp_peer_get() will return if there is a peer RDT
|
|
|
+ * resource and the exact instance that shares the same hardware.
|
|
|
+ *
|
|
|
+ * Return: 0 if a CDP peer was found, <0 on error or if no CDP peer exists.
|
|
|
+ * 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)
|
|
|
+{
|
|
|
+ struct rdt_resource *_r_cdp = NULL;
|
|
|
+ struct rdt_domain *_d_cdp = NULL;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ switch (r->rid) {
|
|
|
+ case RDT_RESOURCE_L3DATA:
|
|
|
+ _r_cdp = &rdt_resources_all[RDT_RESOURCE_L3CODE];
|
|
|
+ break;
|
|
|
+ case RDT_RESOURCE_L3CODE:
|
|
|
+ _r_cdp = &rdt_resources_all[RDT_RESOURCE_L3DATA];
|
|
|
+ break;
|
|
|
+ case RDT_RESOURCE_L2DATA:
|
|
|
+ _r_cdp = &rdt_resources_all[RDT_RESOURCE_L2CODE];
|
|
|
+ break;
|
|
|
+ case RDT_RESOURCE_L2CODE:
|
|
|
+ _r_cdp = &rdt_resources_all[RDT_RESOURCE_L2DATA];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ ret = -ENOENT;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * When a new CPU comes online and CDP is enabled then the new
|
|
|
+ * RDT domains (if any) associated with both CDP RDT resources
|
|
|
+ * are added in the same CPU online routine while the
|
|
|
+ * rdtgroup_mutex is held. It should thus not happen for one
|
|
|
+ * RDT domain to exist and be associated with its RDT CDP
|
|
|
+ * resource but there is no RDT domain associated with the
|
|
|
+ * peer RDT CDP resource. Hence the WARN.
|
|
|
+ */
|
|
|
+ _d_cdp = rdt_find_domain(_r_cdp, d->id, NULL);
|
|
|
+ if (WARN_ON(!_d_cdp)) {
|
|
|
+ _r_cdp = NULL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+out:
|
|
|
+ *r_cdp = _r_cdp;
|
|
|
+ *d_cdp = _d_cdp;
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* rdtgroup_cbm_overlaps - Does CBM for intended closid overlap with other
|
|
|
* @r: Resource to which domain instance @d belongs.
|