• Lukas Wunner's avatar
    cxl/pci: Rightsize CDAT response allocation · f960e57d
    Lukas Wunner authored
    Jonathan notes that cxl_cdat_get_length() and cxl_cdat_read_table()
    allocate 32 dwords for the DOE response even though it may be smaller.
    
    In the case of cxl_cdat_get_length(), only the second dword of the
    response is of interest (it contains the length).  So reduce the
    allocation to 2 dwords and let DOE discard the remainder.
    
    In the case of cxl_cdat_read_table(), a correctly sized allocation for
    the full CDAT already exists.  Let DOE write each table entry directly
    into that allocation.  There's a snag in that the table entry is
    preceded by a Table Access Response Header (1 dword, CXL 3.0 table 8-14).
    Save the last dword of the previous table entry, let DOE overwrite it
    with the header of the next entry and restore it afterwards.
    
    The resulting CDAT is preceded by 4 unavoidable useless bytes.  Increase
    the allocation size accordingly.
    
    The buffer overflow check in cxl_cdat_read_table() becomes unnecessary
    because the remaining bytes in the allocation are tracked in "length",
    which is passed to DOE and limits how many bytes it writes to the
    allocation.  Additionally, cxl_cdat_read_table() bails out if the DOE
    response is truncated due to insufficient space.
    Tested-by: default avatarIra Weiny <ira.weiny@intel.com>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Dave Jiang <dave.jiang@intel.com>
    Link: https://lore.kernel.org/r/7a4e1f86958a79a70f29b96a92199522f08f8322.1678543498.git.lukas@wunner.deSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    f960e57d
pci.c 17 KB