diff options
Diffstat (limited to 'drivers/misc/habanalabs/common/command_buffer.c')
| -rw-r--r-- | drivers/misc/habanalabs/common/command_buffer.c | 12 | 
1 files changed, 9 insertions, 3 deletions
| diff --git a/drivers/misc/habanalabs/common/command_buffer.c b/drivers/misc/habanalabs/common/command_buffer.c index d9adb9a5e4d8..719168c980a4 100644 --- a/drivers/misc/habanalabs/common/command_buffer.c +++ b/drivers/misc/habanalabs/common/command_buffer.c @@ -181,7 +181,7 @@ static void cb_release(struct kref *ref)  static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,  					int ctx_id, bool internal_cb)  { -	struct hl_cb *cb; +	struct hl_cb *cb = NULL;  	u32 cb_offset;  	void *p; @@ -193,9 +193,10 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,  	 * the kernel's copy. Hence, we must never sleep in this code section  	 * and must use GFP_ATOMIC for all memory allocations.  	 */ -	if (ctx_id == HL_KERNEL_ASID_ID) +	if (ctx_id == HL_KERNEL_ASID_ID && !hdev->disabled)  		cb = kzalloc(sizeof(*cb), GFP_ATOMIC); -	else + +	if (!cb)  		cb = kzalloc(sizeof(*cb), GFP_KERNEL);  	if (!cb) @@ -214,6 +215,9 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,  	} else if (ctx_id == HL_KERNEL_ASID_ID) {  		p = hdev->asic_funcs->asic_dma_alloc_coherent(hdev, cb_size,  						&cb->bus_address, GFP_ATOMIC); +		if (!p) +			p = hdev->asic_funcs->asic_dma_alloc_coherent(hdev, +					cb_size, &cb->bus_address, GFP_KERNEL);  	} else {  		p = hdev->asic_funcs->asic_dma_alloc_coherent(hdev, cb_size,  						&cb->bus_address, @@ -310,6 +314,8 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,  	spin_lock(&mgr->cb_lock);  	rc = idr_alloc(&mgr->cb_handles, cb, 1, 0, GFP_ATOMIC); +	if (rc < 0) +		rc = idr_alloc(&mgr->cb_handles, cb, 1, 0, GFP_KERNEL);  	spin_unlock(&mgr->cb_lock);  	if (rc < 0) { | 
