Commit 829ec038 authored by Yuri Nudelman's avatar Yuri Nudelman Committed by Greg Kroah-Hartman

habanalabs: use unified memory manager for CB flow

With the new code required for the flow added, we can now switch
to using the new memory manager infrastructure, removing the old code.
Signed-off-by: default avatarYuri Nudelman <ynudelman@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent dc653c36
...@@ -1071,17 +1071,14 @@ static int validate_queue_index(struct hl_device *hdev, ...@@ -1071,17 +1071,14 @@ static int validate_queue_index(struct hl_device *hdev,
} }
static struct hl_cb *get_cb_from_cs_chunk(struct hl_device *hdev, static struct hl_cb *get_cb_from_cs_chunk(struct hl_device *hdev,
struct hl_cb_mgr *cb_mgr, struct hl_mem_mgr *mmg,
struct hl_cs_chunk *chunk) struct hl_cs_chunk *chunk)
{ {
struct hl_cb *cb; struct hl_cb *cb;
u32 cb_handle;
cb_handle = (u32) (chunk->cb_handle >> PAGE_SHIFT); cb = hl_cb_get(mmg, chunk->cb_handle);
cb = hl_cb_get(hdev, cb_mgr, cb_handle);
if (!cb) { if (!cb) {
dev_err(hdev->dev, "CB handle 0x%x invalid\n", cb_handle); dev_err(hdev->dev, "CB handle 0x%llx invalid\n", chunk->cb_handle);
return NULL; return NULL;
} }
...@@ -1343,7 +1340,7 @@ static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks, ...@@ -1343,7 +1340,7 @@ static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks,
} }
if (is_kernel_allocated_cb) { if (is_kernel_allocated_cb) {
cb = get_cb_from_cs_chunk(hdev, &hpriv->cb_mgr, chunk); cb = get_cb_from_cs_chunk(hdev, &hpriv->mem_mgr, chunk);
if (!cb) { if (!cb) {
atomic64_inc( atomic64_inc(
&ctx->cs_counters.validation_drop_cnt); &ctx->cs_counters.validation_drop_cnt);
...@@ -1771,7 +1768,7 @@ static int cs_ioctl_signal_wait_create_jobs(struct hl_device *hdev, ...@@ -1771,7 +1768,7 @@ static int cs_ioctl_signal_wait_create_jobs(struct hl_device *hdev,
*/ */
job->patched_cb = job->user_cb; job->patched_cb = job->user_cb;
job->job_cb_size = job->user_cb_size; job->job_cb_size = job->user_cb_size;
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT); hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
/* increment refcount as for external queues we get completion */ /* increment refcount as for external queues we get completion */
cs_get(cs); cs_get(cs);
...@@ -2946,13 +2943,12 @@ static int ts_buff_get_kernel_ts_record(struct hl_mmap_mem_buf *buf, ...@@ -2946,13 +2943,12 @@ static int ts_buff_get_kernel_ts_record(struct hl_mmap_mem_buf *buf,
} }
static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx, static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
struct hl_cb_mgr *cb_mgr, struct hl_mem_mgr *mmg, struct hl_mem_mgr *cb_mmg, struct hl_mem_mgr *mmg,
u64 timeout_us, u64 cq_counters_handle, u64 cq_counters_offset, u64 timeout_us, u64 cq_counters_handle, u64 cq_counters_offset,
u64 target_value, struct hl_user_interrupt *interrupt, u64 target_value, struct hl_user_interrupt *interrupt,
bool register_ts_record, u64 ts_handle, u64 ts_offset, bool register_ts_record, u64 ts_handle, u64 ts_offset,
u32 *status, u64 *timestamp) u32 *status, u64 *timestamp)
{ {
u32 cq_patched_handle;
struct hl_user_pending_interrupt *pend; struct hl_user_pending_interrupt *pend;
struct hl_mmap_mem_buf *buf; struct hl_mmap_mem_buf *buf;
struct hl_cb *cq_cb; struct hl_cb *cq_cb;
...@@ -2964,8 +2960,7 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx, ...@@ -2964,8 +2960,7 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
hl_ctx_get(hdev, ctx); hl_ctx_get(hdev, ctx);
cq_patched_handle = lower_32_bits(cq_counters_handle >> PAGE_SHIFT); cq_cb = hl_cb_get(cb_mmg, cq_counters_handle);
cq_cb = hl_cb_get(hdev, cb_mgr, cq_patched_handle);
if (!cq_cb) { if (!cq_cb) {
rc = -EINVAL; rc = -EINVAL;
goto put_ctx; goto put_ctx;
...@@ -3250,7 +3245,7 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -3250,7 +3245,7 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
interrupt = &hdev->user_interrupt[interrupt_id - first_interrupt]; interrupt = &hdev->user_interrupt[interrupt_id - first_interrupt];
if (args->in.flags & HL_WAIT_CS_FLAGS_INTERRUPT_KERNEL_CQ) if (args->in.flags & HL_WAIT_CS_FLAGS_INTERRUPT_KERNEL_CQ)
rc = _hl_interrupt_wait_ioctl(hdev, hpriv->ctx, &hpriv->cb_mgr, &hpriv->mem_mgr, rc = _hl_interrupt_wait_ioctl(hdev, hpriv->ctx, &hpriv->mem_mgr, &hpriv->mem_mgr,
args->in.interrupt_timeout_us, args->in.cq_counters_handle, args->in.interrupt_timeout_us, args->in.cq_counters_handle,
args->in.cq_counters_offset, args->in.cq_counters_offset,
args->in.target, interrupt, args->in.target, interrupt,
......
...@@ -126,9 +126,9 @@ static int command_buffers_show(struct seq_file *s, void *data) ...@@ -126,9 +126,9 @@ static int command_buffers_show(struct seq_file *s, void *data)
} }
seq_printf(s, seq_printf(s,
" %03llu %d 0x%08x %d %d %d\n", " %03llu %d 0x%08x %d %d %d\n",
cb->id, cb->ctx->asid, cb->size, cb->buf->handle, cb->ctx->asid, cb->size,
kref_read(&cb->refcount), kref_read(&cb->buf->refcount),
cb->mmap, atomic_read(&cb->cs_cnt)); atomic_read(&cb->buf->mmap), atomic_read(&cb->cs_cnt));
} }
spin_unlock(&dev_entry->cb_spinlock); spin_unlock(&dev_entry->cb_spinlock);
......
...@@ -324,7 +324,6 @@ static int hl_device_release(struct inode *inode, struct file *filp) ...@@ -324,7 +324,6 @@ static int hl_device_release(struct inode *inode, struct file *filp)
*/ */
hl_release_pending_user_interrupts(hpriv->hdev); hl_release_pending_user_interrupts(hpriv->hdev);
hl_cb_mgr_fini(hdev, &hpriv->cb_mgr);
hl_mem_mgr_fini(&hpriv->mem_mgr); hl_mem_mgr_fini(&hpriv->mem_mgr);
hl_ctx_mgr_fini(hdev, &hpriv->ctx_mgr); hl_ctx_mgr_fini(hdev, &hpriv->ctx_mgr);
...@@ -386,14 +385,11 @@ static int hl_mmap(struct file *filp, struct vm_area_struct *vma) ...@@ -386,14 +385,11 @@ static int hl_mmap(struct file *filp, struct vm_area_struct *vma)
vm_pgoff = vma->vm_pgoff; vm_pgoff = vma->vm_pgoff;
switch (vm_pgoff & HL_MMAP_TYPE_MASK) { switch (vm_pgoff & HL_MMAP_TYPE_MASK) {
case HL_MMAP_TYPE_CB:
vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff);
return hl_cb_mmap(hpriv, vma);
case HL_MMAP_TYPE_BLOCK: case HL_MMAP_TYPE_BLOCK:
vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff); vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff);
return hl_hw_block_mmap(hpriv, vma); return hl_hw_block_mmap(hpriv, vma);
case HL_MMAP_TYPE_CB:
case HL_MMAP_TYPE_TS_BUFF: case HL_MMAP_TYPE_TS_BUFF:
return hl_mem_mgr_mmap(&hpriv->mem_mgr, vma, NULL); return hl_mem_mgr_mmap(&hpriv->mem_mgr, vma, NULL);
} }
...@@ -616,7 +612,7 @@ static int device_early_init(struct hl_device *hdev) ...@@ -616,7 +612,7 @@ static int device_early_init(struct hl_device *hdev)
if (rc) if (rc)
goto free_chip_info; goto free_chip_info;
hl_cb_mgr_init(&hdev->kernel_cb_mgr); hl_mem_mgr_init(hdev->dev, &hdev->kernel_mem_mgr);
hdev->device_reset_work.wq = hdev->device_reset_work.wq =
create_singlethread_workqueue("hl_device_reset"); create_singlethread_workqueue("hl_device_reset");
...@@ -645,7 +641,7 @@ static int device_early_init(struct hl_device *hdev) ...@@ -645,7 +641,7 @@ static int device_early_init(struct hl_device *hdev)
return 0; return 0;
free_cb_mgr: free_cb_mgr:
hl_cb_mgr_fini(hdev, &hdev->kernel_cb_mgr); hl_mem_mgr_fini(&hdev->kernel_mem_mgr);
free_chip_info: free_chip_info:
kfree(hdev->hl_chip_info); kfree(hdev->hl_chip_info);
free_ts_free_wq: free_ts_free_wq:
...@@ -684,7 +680,7 @@ static void device_early_fini(struct hl_device *hdev) ...@@ -684,7 +680,7 @@ static void device_early_fini(struct hl_device *hdev)
mutex_destroy(&hdev->clk_throttling.lock); mutex_destroy(&hdev->clk_throttling.lock);
hl_cb_mgr_fini(hdev, &hdev->kernel_cb_mgr); hl_mem_mgr_fini(&hdev->kernel_mem_mgr);
kfree(hdev->hl_chip_info); kfree(hdev->hl_chip_info);
......
...@@ -703,26 +703,6 @@ struct hl_cs_compl { ...@@ -703,26 +703,6 @@ struct hl_cs_compl {
* Command Buffers * Command Buffers
*/ */
/**
* struct hl_cb_mgr - describes a Command Buffer Manager.
* @cb_lock: protects cb_handles.
* @cb_handles: an idr to hold all command buffer handles.
*/
struct hl_cb_mgr {
spinlock_t cb_lock;
struct idr cb_handles; /* protected by cb_lock */
};
/**
* struct hl_ts_mgr - describes the timestamp registration memory manager.
* @ts_lock: protects ts_handles.
* @ts_handles: an idr to hold all ts bufferes handles.
*/
struct hl_ts_mgr {
spinlock_t ts_lock;
struct idr ts_handles;
};
/** /**
* struct hl_ts_buff - describes a timestamp buffer. * struct hl_ts_buff - describes a timestamp buffer.
* @kernel_buff_address: Holds the internal buffer's kernel virtual address. * @kernel_buff_address: Holds the internal buffer's kernel virtual address.
...@@ -792,42 +772,32 @@ struct hl_mmap_mem_buf { ...@@ -792,42 +772,32 @@ struct hl_mmap_mem_buf {
/** /**
* struct hl_cb - describes a Command Buffer. * struct hl_cb - describes a Command Buffer.
* @refcount: reference counter for usage of the CB.
* @hdev: pointer to device this CB belongs to. * @hdev: pointer to device this CB belongs to.
* @ctx: pointer to the CB owner's context. * @ctx: pointer to the CB owner's context.
* @lock: spinlock to protect mmap flows.
* @buf: back pointer to the parent mappable memory buffer * @buf: back pointer to the parent mappable memory buffer
* @debugfs_list: node in debugfs list of command buffers. * @debugfs_list: node in debugfs list of command buffers.
* @pool_list: node in pool list of command buffers. * @pool_list: node in pool list of command buffers.
* @va_block_list: list of virtual addresses blocks of the CB if it is mapped to * @va_block_list: list of virtual addresses blocks of the CB if it is mapped to
* the device's MMU. * the device's MMU.
* @id: the CB's ID.
* @kernel_address: Holds the CB's kernel virtual address. * @kernel_address: Holds the CB's kernel virtual address.
* @bus_address: Holds the CB's DMA address. * @bus_address: Holds the CB's DMA address.
* @mmap_size: Holds the CB's size that was mmaped.
* @size: holds the CB's size. * @size: holds the CB's size.
* @cs_cnt: holds number of CS that this CB participates in. * @cs_cnt: holds number of CS that this CB participates in.
* @mmap: true if the CB is currently mmaped to user.
* @is_pool: true if CB was acquired from the pool, false otherwise. * @is_pool: true if CB was acquired from the pool, false otherwise.
* @is_internal: internaly allocated * @is_internal: internaly allocated
* @is_mmu_mapped: true if the CB is mapped to the device's MMU. * @is_mmu_mapped: true if the CB is mapped to the device's MMU.
*/ */
struct hl_cb { struct hl_cb {
struct kref refcount;
struct hl_device *hdev; struct hl_device *hdev;
struct hl_ctx *ctx; struct hl_ctx *ctx;
spinlock_t lock;
struct hl_mmap_mem_buf *buf; struct hl_mmap_mem_buf *buf;
struct list_head debugfs_list; struct list_head debugfs_list;
struct list_head pool_list; struct list_head pool_list;
struct list_head va_block_list; struct list_head va_block_list;
u64 id;
void *kernel_address; void *kernel_address;
dma_addr_t bus_address; dma_addr_t bus_address;
u32 mmap_size;
u32 size; u32 size;
atomic_t cs_cnt; atomic_t cs_cnt;
u8 mmap;
u8 is_pool; u8 is_pool;
u8 is_internal; u8 is_internal;
u8 is_mmu_mapped; u8 is_mmu_mapped;
...@@ -1982,7 +1952,6 @@ struct hl_fpriv { ...@@ -1982,7 +1952,6 @@ struct hl_fpriv {
struct pid *taskpid; struct pid *taskpid;
struct hl_ctx *ctx; struct hl_ctx *ctx;
struct hl_ctx_mgr ctx_mgr; struct hl_ctx_mgr ctx_mgr;
struct hl_cb_mgr cb_mgr;
struct hl_mem_mgr mem_mgr; struct hl_mem_mgr mem_mgr;
struct list_head debugfs_list; struct list_head debugfs_list;
struct list_head dev_node; struct list_head dev_node;
...@@ -2663,7 +2632,6 @@ struct hl_reset_info { ...@@ -2663,7 +2632,6 @@ struct hl_reset_info {
* @kernel_queues: array of hl_hw_queue. * @kernel_queues: array of hl_hw_queue.
* @cs_mirror_list: CS mirror list for TDR. * @cs_mirror_list: CS mirror list for TDR.
* @cs_mirror_lock: protects cs_mirror_list. * @cs_mirror_lock: protects cs_mirror_list.
* @kernel_cb_mgr: command buffer manager for creating/destroying/handling CBs.
* @kernel_mem_mgr: memory manager for memory buffers with lifespan of driver. * @kernel_mem_mgr: memory manager for memory buffers with lifespan of driver.
* @event_queue: event queue for IRQ from CPU-CP. * @event_queue: event queue for IRQ from CPU-CP.
* @dma_pool: DMA pool for small allocations. * @dma_pool: DMA pool for small allocations.
...@@ -2796,7 +2764,6 @@ struct hl_device { ...@@ -2796,7 +2764,6 @@ struct hl_device {
struct hl_hw_queue *kernel_queues; struct hl_hw_queue *kernel_queues;
struct list_head cs_mirror_list; struct list_head cs_mirror_list;
spinlock_t cs_mirror_lock; spinlock_t cs_mirror_lock;
struct hl_cb_mgr kernel_cb_mgr;
struct hl_mem_mgr kernel_mem_mgr; struct hl_mem_mgr kernel_mem_mgr;
struct hl_eq event_queue; struct hl_eq event_queue;
struct dma_pool *dma_pool; struct dma_pool *dma_pool;
...@@ -3102,21 +3069,13 @@ void hl_sysfs_fini(struct hl_device *hdev); ...@@ -3102,21 +3069,13 @@ void hl_sysfs_fini(struct hl_device *hdev);
int hl_hwmon_init(struct hl_device *hdev); int hl_hwmon_init(struct hl_device *hdev);
void hl_hwmon_fini(struct hl_device *hdev); void hl_hwmon_fini(struct hl_device *hdev);
int hl_cb_create_unified_mem_mgr(struct hl_device *hdev, struct hl_mem_mgr *mmg, int hl_cb_create(struct hl_device *hdev, struct hl_mem_mgr *mmg,
struct hl_ctx *ctx, u32 cb_size, bool internal_cb,
bool map_cb, u64 *handle);
int hl_cb_destroy_unified_mem_mgr(struct hl_mem_mgr *mmg, u64 cb_handle);
int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
struct hl_ctx *ctx, u32 cb_size, bool internal_cb, struct hl_ctx *ctx, u32 cb_size, bool internal_cb,
bool map_cb, u64 *handle); bool map_cb, u64 *handle);
int hl_cb_destroy(struct hl_device *hdev, struct hl_cb_mgr *mgr, u64 cb_handle); int hl_cb_destroy(struct hl_mem_mgr *mmg, u64 cb_handle);
int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma);
int hl_hw_block_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma); int hl_hw_block_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma);
struct hl_cb *hl_cb_get(struct hl_device *hdev, struct hl_cb_mgr *mgr, struct hl_cb *hl_cb_get(struct hl_mem_mgr *mmg, u64 handle);
u32 handle);
void hl_cb_put(struct hl_cb *cb); void hl_cb_put(struct hl_cb *cb);
void hl_cb_mgr_init(struct hl_cb_mgr *mgr);
void hl_cb_mgr_fini(struct hl_device *hdev, struct hl_cb_mgr *mgr);
struct hl_cb *hl_cb_kernel_create(struct hl_device *hdev, u32 cb_size, struct hl_cb *hl_cb_kernel_create(struct hl_device *hdev, u32 cb_size,
bool internal_cb); bool internal_cb);
int hl_cb_pool_init(struct hl_device *hdev); int hl_cb_pool_init(struct hl_device *hdev);
......
...@@ -138,7 +138,6 @@ int hl_device_open(struct inode *inode, struct file *filp) ...@@ -138,7 +138,6 @@ int hl_device_open(struct inode *inode, struct file *filp)
kref_init(&hpriv->refcount); kref_init(&hpriv->refcount);
nonseekable_open(inode, filp); nonseekable_open(inode, filp);
hl_cb_mgr_init(&hpriv->cb_mgr);
hl_ctx_mgr_init(&hpriv->ctx_mgr); hl_ctx_mgr_init(&hpriv->ctx_mgr);
hl_mem_mgr_init(hpriv->hdev->dev, &hpriv->mem_mgr); hl_mem_mgr_init(hpriv->hdev->dev, &hpriv->mem_mgr);
...@@ -197,7 +196,6 @@ int hl_device_open(struct inode *inode, struct file *filp) ...@@ -197,7 +196,6 @@ int hl_device_open(struct inode *inode, struct file *filp)
out_err: out_err:
mutex_unlock(&hdev->fpriv_list_lock); mutex_unlock(&hdev->fpriv_list_lock);
hl_cb_mgr_fini(hpriv->hdev, &hpriv->cb_mgr);
hl_mem_mgr_fini(&hpriv->mem_mgr); hl_mem_mgr_fini(&hpriv->mem_mgr);
hl_ctx_mgr_fini(hpriv->hdev, &hpriv->ctx_mgr); hl_ctx_mgr_fini(hpriv->hdev, &hpriv->ctx_mgr);
filp->private_data = NULL; filp->private_data = NULL;
......
...@@ -1011,7 +1011,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev, ...@@ -1011,7 +1011,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev,
release_cb: release_cb:
hl_cb_put(cb); hl_cb_put(cb);
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT); hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
return rc; return rc;
} }
...@@ -1473,7 +1473,7 @@ static int gaudi_collective_wait_create_job(struct hl_device *hdev, ...@@ -1473,7 +1473,7 @@ static int gaudi_collective_wait_create_job(struct hl_device *hdev,
job->patched_cb = NULL; job->patched_cb = NULL;
job->job_cb_size = job->user_cb_size; job->job_cb_size = job->user_cb_size;
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT); hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
/* increment refcount as for external queues we get completion */ /* increment refcount as for external queues we get completion */
if (hw_queue_prop->type == QUEUE_TYPE_EXT) if (hw_queue_prop->type == QUEUE_TYPE_EXT)
...@@ -5525,7 +5525,7 @@ static int gaudi_patch_cb(struct hl_device *hdev, ...@@ -5525,7 +5525,7 @@ static int gaudi_patch_cb(struct hl_device *hdev,
static int gaudi_parse_cb_mmu(struct hl_device *hdev, static int gaudi_parse_cb_mmu(struct hl_device *hdev,
struct hl_cs_parser *parser) struct hl_cs_parser *parser)
{ {
u64 patched_cb_handle; u64 handle;
u32 patched_cb_size; u32 patched_cb_size;
struct hl_cb *user_cb; struct hl_cb *user_cb;
int rc; int rc;
...@@ -5541,9 +5541,9 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev, ...@@ -5541,9 +5541,9 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
else else
parser->patched_cb_size = parser->user_cb_size; parser->patched_cb_size = parser->user_cb_size;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx, rc = hl_cb_create(hdev, &hdev->kernel_mem_mgr, hdev->kernel_ctx,
parser->patched_cb_size, false, false, parser->patched_cb_size, false, false,
&patched_cb_handle); &handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
...@@ -5552,13 +5552,10 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev, ...@@ -5552,13 +5552,10 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
return rc; return rc;
} }
patched_cb_handle >>= PAGE_SHIFT; parser->patched_cb = hl_cb_get(&hdev->kernel_mem_mgr, handle);
parser->patched_cb = hl_cb_get(hdev, &hdev->kernel_cb_mgr,
(u32) patched_cb_handle);
/* hl_cb_get should never fail */ /* hl_cb_get should never fail */
if (!parser->patched_cb) { if (!parser->patched_cb) {
dev_crit(hdev->dev, "DMA CB handle invalid 0x%x\n", dev_crit(hdev->dev, "DMA CB handle invalid 0x%llx\n", handle);
(u32) patched_cb_handle);
rc = -EFAULT; rc = -EFAULT;
goto out; goto out;
} }
...@@ -5598,8 +5595,7 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev, ...@@ -5598,8 +5595,7 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
* cb_put will release it, but here we want to remove it from the * cb_put will release it, but here we want to remove it from the
* idr * idr
*/ */
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, hl_cb_destroy(&hdev->kernel_mem_mgr, handle);
patched_cb_handle << PAGE_SHIFT);
return rc; return rc;
} }
...@@ -5607,7 +5603,7 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev, ...@@ -5607,7 +5603,7 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
static int gaudi_parse_cb_no_mmu(struct hl_device *hdev, static int gaudi_parse_cb_no_mmu(struct hl_device *hdev,
struct hl_cs_parser *parser) struct hl_cs_parser *parser)
{ {
u64 patched_cb_handle; u64 handle;
int rc; int rc;
rc = gaudi_validate_cb(hdev, parser, false); rc = gaudi_validate_cb(hdev, parser, false);
...@@ -5615,22 +5611,19 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev, ...@@ -5615,22 +5611,19 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev,
if (rc) if (rc)
goto free_userptr; goto free_userptr;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx, rc = hl_cb_create(hdev, &hdev->kernel_mem_mgr, hdev->kernel_ctx,
parser->patched_cb_size, false, false, parser->patched_cb_size, false, false,
&patched_cb_handle); &handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
"Failed to allocate patched CB for DMA CS %d\n", rc); "Failed to allocate patched CB for DMA CS %d\n", rc);
goto free_userptr; goto free_userptr;
} }
patched_cb_handle >>= PAGE_SHIFT; parser->patched_cb = hl_cb_get(&hdev->kernel_mem_mgr, handle);
parser->patched_cb = hl_cb_get(hdev, &hdev->kernel_cb_mgr,
(u32) patched_cb_handle);
/* hl_cb_get should never fail here */ /* hl_cb_get should never fail here */
if (!parser->patched_cb) { if (!parser->patched_cb) {
dev_crit(hdev->dev, "DMA CB handle invalid 0x%x\n", dev_crit(hdev->dev, "DMA CB handle invalid 0x%llx\n", handle);
(u32) patched_cb_handle);
rc = -EFAULT; rc = -EFAULT;
goto out; goto out;
} }
...@@ -5647,8 +5640,7 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev, ...@@ -5647,8 +5640,7 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev,
* cb_put will release it, but here we want to remove it from the * cb_put will release it, but here we want to remove it from the
* idr * idr
*/ */
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, hl_cb_destroy(&hdev->kernel_mem_mgr, handle);
patched_cb_handle << PAGE_SHIFT);
free_userptr: free_userptr:
if (rc) if (rc)
...@@ -5761,7 +5753,6 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr, ...@@ -5761,7 +5753,6 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
struct hl_cs_job *job; struct hl_cs_job *job;
u32 cb_size, ctl, err_cause; u32 cb_size, ctl, err_cause;
struct hl_cb *cb; struct hl_cb *cb;
u64 id;
int rc; int rc;
cb = hl_cb_kernel_create(hdev, PAGE_SIZE, false); cb = hl_cb_kernel_create(hdev, PAGE_SIZE, false);
...@@ -5828,9 +5819,8 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr, ...@@ -5828,9 +5819,8 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
} }
release_cb: release_cb:
id = cb->id;
hl_cb_put(cb); hl_cb_put(cb);
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, id << PAGE_SHIFT); hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
return rc; return rc;
} }
...@@ -5893,7 +5883,7 @@ static int gaudi_memset_registers(struct hl_device *hdev, u64 reg_base, ...@@ -5893,7 +5883,7 @@ static int gaudi_memset_registers(struct hl_device *hdev, u64 reg_base,
release_cb: release_cb:
hl_cb_put(cb); hl_cb_put(cb);
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT); hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
return rc; return rc;
} }
......
...@@ -4001,7 +4001,7 @@ static int goya_patch_cb(struct hl_device *hdev, ...@@ -4001,7 +4001,7 @@ static int goya_patch_cb(struct hl_device *hdev,
static int goya_parse_cb_mmu(struct hl_device *hdev, static int goya_parse_cb_mmu(struct hl_device *hdev,
struct hl_cs_parser *parser) struct hl_cs_parser *parser)
{ {
u64 patched_cb_handle; u64 handle;
u32 patched_cb_size; u32 patched_cb_size;
struct hl_cb *user_cb; struct hl_cb *user_cb;
int rc; int rc;
...@@ -4014,9 +4014,9 @@ static int goya_parse_cb_mmu(struct hl_device *hdev, ...@@ -4014,9 +4014,9 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
parser->patched_cb_size = parser->user_cb_size + parser->patched_cb_size = parser->user_cb_size +
sizeof(struct packet_msg_prot) * 2; sizeof(struct packet_msg_prot) * 2;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx, rc = hl_cb_create(hdev, &hdev->kernel_mem_mgr, hdev->kernel_ctx,
parser->patched_cb_size, false, false, parser->patched_cb_size, false, false,
&patched_cb_handle); &handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
...@@ -4025,13 +4025,10 @@ static int goya_parse_cb_mmu(struct hl_device *hdev, ...@@ -4025,13 +4025,10 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
return rc; return rc;
} }
patched_cb_handle >>= PAGE_SHIFT; parser->patched_cb = hl_cb_get(&hdev->kernel_mem_mgr, handle);
parser->patched_cb = hl_cb_get(hdev, &hdev->kernel_cb_mgr,
(u32) patched_cb_handle);
/* hl_cb_get should never fail here */ /* hl_cb_get should never fail here */
if (!parser->patched_cb) { if (!parser->patched_cb) {
dev_crit(hdev->dev, "DMA CB handle invalid 0x%x\n", dev_crit(hdev->dev, "DMA CB handle invalid 0x%llx\n", handle);
(u32) patched_cb_handle);
rc = -EFAULT; rc = -EFAULT;
goto out; goto out;
} }
...@@ -4071,8 +4068,7 @@ static int goya_parse_cb_mmu(struct hl_device *hdev, ...@@ -4071,8 +4068,7 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
* cb_put will release it, but here we want to remove it from the * cb_put will release it, but here we want to remove it from the
* idr * idr
*/ */
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, hl_cb_destroy(&hdev->kernel_mem_mgr, handle);
patched_cb_handle << PAGE_SHIFT);
return rc; return rc;
} }
...@@ -4080,7 +4076,7 @@ static int goya_parse_cb_mmu(struct hl_device *hdev, ...@@ -4080,7 +4076,7 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
static int goya_parse_cb_no_mmu(struct hl_device *hdev, static int goya_parse_cb_no_mmu(struct hl_device *hdev,
struct hl_cs_parser *parser) struct hl_cs_parser *parser)
{ {
u64 patched_cb_handle; u64 handle;
int rc; int rc;
rc = goya_validate_cb(hdev, parser, false); rc = goya_validate_cb(hdev, parser, false);
...@@ -4088,22 +4084,19 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev, ...@@ -4088,22 +4084,19 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev,
if (rc) if (rc)
goto free_userptr; goto free_userptr;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx, rc = hl_cb_create(hdev, &hdev->kernel_mem_mgr, hdev->kernel_ctx,
parser->patched_cb_size, false, false, parser->patched_cb_size, false, false,
&patched_cb_handle); &handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
"Failed to allocate patched CB for DMA CS %d\n", rc); "Failed to allocate patched CB for DMA CS %d\n", rc);
goto free_userptr; goto free_userptr;
} }
patched_cb_handle >>= PAGE_SHIFT; parser->patched_cb = hl_cb_get(&hdev->kernel_mem_mgr, handle);
parser->patched_cb = hl_cb_get(hdev, &hdev->kernel_cb_mgr,
(u32) patched_cb_handle);
/* hl_cb_get should never fail here */ /* hl_cb_get should never fail here */
if (!parser->patched_cb) { if (!parser->patched_cb) {
dev_crit(hdev->dev, "DMA CB handle invalid 0x%x\n", dev_crit(hdev->dev, "DMA CB handle invalid 0x%llx\n", handle);
(u32) patched_cb_handle);
rc = -EFAULT; rc = -EFAULT;
goto out; goto out;
} }
...@@ -4120,8 +4113,7 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev, ...@@ -4120,8 +4113,7 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev,
* cb_put will release it, but here we want to remove it from the * cb_put will release it, but here we want to remove it from the
* idr * idr
*/ */
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, hl_cb_destroy(&hdev->kernel_mem_mgr, handle);
patched_cb_handle << PAGE_SHIFT);
free_userptr: free_userptr:
if (rc) if (rc)
...@@ -4853,7 +4845,7 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size, ...@@ -4853,7 +4845,7 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
release_cb: release_cb:
hl_cb_put(cb); hl_cb_put(cb);
hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT); hl_cb_destroy(&hdev->kernel_mem_mgr, cb->buf->handle);
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment