mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
drm/amdgpu: add an option to allow gpu partition allocate all available memory
Current driver reports and limits memory allocation for each partition equally among partitions using same memory partition. Application may not be able to use all available memory when run on a partitioned gpu though system still has enough free memory. Add an option that app can use to have gpu partition allocate all available memory. Signed-off-by: Xiaogang Chen <xiaogang.chen@amd.com> Reviewed-by: Philip Yang <philip.yang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
f315099fd2
commit
e0e9792ea2
|
|
@ -805,7 +805,10 @@ u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id)
|
|||
} else {
|
||||
tmp = adev->gmc.mem_partitions[mem_id].size;
|
||||
}
|
||||
do_div(tmp, adev->xcp_mgr->num_xcp_per_mem_partition);
|
||||
|
||||
if (adev->xcp_mgr->mem_alloc_mode == AMDGPU_PARTITION_MEM_CAPPING_EVEN)
|
||||
do_div(tmp, adev->xcp_mgr->num_xcp_per_mem_partition);
|
||||
|
||||
return ALIGN_DOWN(tmp, PAGE_SIZE);
|
||||
} else if (adev->apu_prefer_gtt) {
|
||||
return (ttm_tt_pages_limit() << PAGE_SHIFT);
|
||||
|
|
|
|||
|
|
@ -1580,6 +1580,36 @@ static ssize_t amdgpu_gfx_set_compute_partition(struct device *dev,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t compute_partition_mem_alloc_mode_show(struct device *dev,
|
||||
struct device_attribute *addr,
|
||||
char *buf)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
int mode = adev->xcp_mgr->mem_alloc_mode;
|
||||
|
||||
return sysfs_emit(buf, "%s\n",
|
||||
amdgpu_gfx_compute_mem_alloc_mode_desc(mode));
|
||||
}
|
||||
|
||||
|
||||
static ssize_t compute_partition_mem_alloc_mode_store(struct device *dev,
|
||||
struct device_attribute *addr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
|
||||
if (!strncasecmp("CAPPING", buf, strlen("CAPPING")))
|
||||
adev->xcp_mgr->mem_alloc_mode = AMDGPU_PARTITION_MEM_CAPPING_EVEN;
|
||||
else if (!strncasecmp("ALL", buf, strlen("ALL")))
|
||||
adev->xcp_mgr->mem_alloc_mode = AMDGPU_PARTITION_MEM_ALLOC_ALL;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const char *xcp_desc[] = {
|
||||
[AMDGPU_SPX_PARTITION_MODE] = "SPX",
|
||||
[AMDGPU_DPX_PARTITION_MODE] = "DPX",
|
||||
|
|
@ -1935,6 +1965,10 @@ static DEVICE_ATTR(gfx_reset_mask, 0444,
|
|||
static DEVICE_ATTR(compute_reset_mask, 0444,
|
||||
amdgpu_gfx_get_compute_reset_mask, NULL);
|
||||
|
||||
static DEVICE_ATTR(compute_partition_mem_alloc_mode, 0644,
|
||||
compute_partition_mem_alloc_mode_show,
|
||||
compute_partition_mem_alloc_mode_store);
|
||||
|
||||
static int amdgpu_gfx_sysfs_xcp_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_xcp_mgr *xcp_mgr = adev->xcp_mgr;
|
||||
|
|
@ -1955,6 +1989,11 @@ static int amdgpu_gfx_sysfs_xcp_init(struct amdgpu_device *adev)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
r = device_create_file(adev->dev,
|
||||
&dev_attr_compute_partition_mem_alloc_mode);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (xcp_switch_supported)
|
||||
r = device_create_file(adev->dev,
|
||||
&dev_attr_available_compute_partition);
|
||||
|
|
|
|||
|
|
@ -71,6 +71,11 @@ enum amdgpu_gfx_partition {
|
|||
AMDGPU_AUTO_COMPUTE_PARTITION_MODE = -2,
|
||||
};
|
||||
|
||||
enum amdgpu_gfx_partition_mem_alloc_mode {
|
||||
AMDGPU_PARTITION_MEM_CAPPING_EVEN = 0,
|
||||
AMDGPU_PARTITION_MEM_ALLOC_ALL = 1,
|
||||
};
|
||||
|
||||
#define NUM_XCC(x) hweight16(x)
|
||||
|
||||
enum amdgpu_gfx_ras_mem_id_type {
|
||||
|
|
@ -677,4 +682,16 @@ static inline const char *amdgpu_gfx_compute_mode_desc(int mode)
|
|||
}
|
||||
}
|
||||
|
||||
static inline const char *amdgpu_gfx_compute_mem_alloc_mode_desc(int mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case AMDGPU_PARTITION_MEM_CAPPING_EVEN:
|
||||
return "CAPPING";
|
||||
case AMDGPU_PARTITION_MEM_ALLOC_ALL:
|
||||
return "ALL";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ int amdgpu_xcp_init(struct amdgpu_xcp_mgr *xcp_mgr, int num_xcps, int mode)
|
|||
}
|
||||
|
||||
xcp_mgr->num_xcps = num_xcps;
|
||||
xcp_mgr->mem_alloc_mode = AMDGPU_PARTITION_MEM_CAPPING_EVEN;
|
||||
amdgpu_xcp_update_partition_sched_list(adev);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -132,6 +132,8 @@ struct amdgpu_xcp_mgr {
|
|||
struct amdgpu_xcp_cfg *xcp_cfg;
|
||||
uint32_t supp_xcp_modes;
|
||||
uint32_t avail_xcp_modes;
|
||||
/* used to determin KFD memory alloc mode for each partition */
|
||||
uint32_t mem_alloc_mode;
|
||||
};
|
||||
|
||||
struct amdgpu_xcp_mgr_funcs {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user