Patch "cxl/region: Match auto-discovered region decoders by HPA range" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    cxl/region: Match auto-discovered region decoders by HPA range

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     cxl-region-match-auto-discovered-region-decoders-by-.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit df4fa23ff13cda36c7c13862ef87004624d16027
Author: Alison Schofield <alison.schofield@xxxxxxxxx>
Date:   Tue Sep 5 14:10:07 2023 -0700

    cxl/region: Match auto-discovered region decoders by HPA range
    
    [ Upstream commit 9e4edf1a2196fa4bea6e8201f166785bd066446a ]
    
    Currently, when the region driver attaches a region to a port, it
    selects the ports next available decoder to program.
    
    With the addition of auto-discovered regions, a port decoder has
    already been programmed so grabbing the next available decoder can
    be a mismatch when there is more than one region using the port.
    
    The failure appears like this with CXL DEBUG enabled:
    
    [] cxl_core:alloc_region_ref:754: cxl region0: endpoint9: HPA order violation region0:[mem 0x14780000000-0x1478fffffff flags 0x200] vs [mem 0x880000000-0x185fffffff flags 0x200]
    [] cxl_core:cxl_port_attach_region:972: cxl region0: endpoint9: failed to allocate region reference
    
    When CXL DEBUG is not enabled, there is no failure message. The region
    just never materializes. Users can suspect this issue if they know their
    firmware has programmed decoders so that more than one region is using
    a port. Note that the problem may appear intermittently, ie not on
    every reboot.
    
    Add a matching method for auto-discovered regions that finds a decoder
    based on an HPA range. The decoder range must exactly match the region
    resource parameter.
    
    Fixes: a32320b71f08 ("cxl/region: Add region autodiscovery")
    Signed-off-by: Alison Schofield <alison.schofield@xxxxxxxxx>
    Reviewed-by: Dave Jiang <dave.jiang@xxxxxxxxx>
    Reviewed-by: Davidlohr Bueso <dave@xxxxxxxxxxxx>
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230905211007.256385-1-alison.schofield@xxxxxxxxx
    Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index e115ba382e044..b4c6a749406f1 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -717,13 +717,35 @@ static int match_free_decoder(struct device *dev, void *data)
 	return 0;
 }
 
+static int match_auto_decoder(struct device *dev, void *data)
+{
+	struct cxl_region_params *p = data;
+	struct cxl_decoder *cxld;
+	struct range *r;
+
+	if (!is_switch_decoder(dev))
+		return 0;
+
+	cxld = to_cxl_decoder(dev);
+	r = &cxld->hpa_range;
+
+	if (p->res && p->res->start == r->start && p->res->end == r->end)
+		return 1;
+
+	return 0;
+}
+
 static struct cxl_decoder *cxl_region_find_decoder(struct cxl_port *port,
 						   struct cxl_region *cxlr)
 {
 	struct device *dev;
 	int id = 0;
 
-	dev = device_find_child(&port->dev, &id, match_free_decoder);
+	if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags))
+		dev = device_find_child(&port->dev, &cxlr->params,
+					match_auto_decoder);
+	else
+		dev = device_find_child(&port->dev, &id, match_free_decoder);
 	if (!dev)
 		return NULL;
 	/*



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux