habanalabs: Add CB IOCTL opcode to retrieve CB information

Add a new CB IOCTL opcode that enables a user to query about a CB and
get its usage count.

Signed-off-by: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
This commit is contained in:
Tomer Tayar 2020-09-02 13:43:32 +03:00 committed by Oded Gabbay
parent f074867454
commit f44afb5b5a
2 changed files with 51 additions and 2 deletions

View File

@ -375,12 +375,43 @@ int hl_cb_destroy(struct hl_device *hdev, struct hl_cb_mgr *mgr, u64 cb_handle)
return rc;
}
static int hl_cb_info(struct hl_device *hdev, struct hl_cb_mgr *mgr,
u64 cb_handle, u32 *usage_cnt)
{
struct hl_cb *cb;
u32 handle;
int rc = 0;
/* The CB handle was given to user to do mmap, so need to shift it back
* to the value which was allocated by the IDR module.
*/
cb_handle >>= PAGE_SHIFT;
handle = (u32) cb_handle;
spin_lock(&mgr->cb_lock);
cb = idr_find(&mgr->cb_handles, handle);
if (!cb) {
dev_err(hdev->dev,
"CB info failed, no match to handle 0x%x\n", handle);
rc = -EINVAL;
goto out;
}
*usage_cnt = atomic_read(&cb->cs_cnt);
out:
spin_unlock(&mgr->cb_lock);
return rc;
}
int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data)
{
union hl_cb_args *args = data;
struct hl_device *hdev = hpriv->hdev;
enum hl_device_status status;
u64 handle = 0;
u32 usage_cnt = 0;
int rc;
if (!hl_device_operational(hdev, &status)) {
@ -413,6 +444,13 @@ int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data)
args->in.cb_handle);
break;
case HL_CB_OP_INFO:
rc = hl_cb_info(hdev, &hpriv->cb_mgr, args->in.cb_handle,
&usage_cnt);
memset(args, 0, sizeof(*args));
args->out.usage_cnt = usage_cnt;
break;
default:
rc = -ENOTTY;
break;

View File

@ -483,6 +483,8 @@ struct hl_info_args {
#define HL_CB_OP_CREATE 0
/* Opcode to destroy previously created command buffer */
#define HL_CB_OP_DESTROY 1
/* Opcode to retrieve information about a command buffer */
#define HL_CB_OP_INFO 2
/* 2MB minus 32 bytes for 2xMSG_PROT */
#define HL_MAX_CB_SIZE (0x200000 - 32)
@ -506,8 +508,17 @@ struct hl_cb_in {
};
struct hl_cb_out {
/* Handle of CB */
__u64 cb_handle;
union {
/* Handle of CB */
__u64 cb_handle;
/* Information about CB */
struct {
/* Usage count of CB */
__u32 usage_cnt;
__u32 pad;
};
};
};
union hl_cb_args {