Revert "nvidia: Optimize the request slots for queueing"

This reverts commit 4c20b236c8523e2af0fcd2f7396577ccf0328eec.
Reason for revert: <Seeing hung issue>

Bug 4260060

Change-Id: Ie9347885dd861ae9afc230c803246f86a0f34615
Signed-off-by: Manish Bhardwaj <mbhardwaj@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2984818
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Manish Bhardwaj
2023-09-25 01:24:14 -07:00
committed by mobile promotions
parent b272a83282
commit 4df331c666
2 changed files with 20 additions and 101 deletions

View File

@@ -42,10 +42,6 @@
VS_BLK_SECURE_ERASE_OP_F | \
VS_BLK_ERASE_OP_F)
#define UFS_IOCTL_MAX_SIZE_SUPPORTED 0x80000
#define READ_WRITE_OR_IOCTL_OP (req_op(bio_req) == REQ_OP_READ \
|| req_op(bio_req) == REQ_OP_WRITE \
|| req_op(bio_req) == REQ_OP_DRV_IN)
#if (IS_ENABLED(CONFIG_TEGRA_HSIERRRPTINJ))
#define HSI_SDMMC4_REPORT_ID 0x805EU
#define HSI_ERROR_MAGIC 0xDEADDEAD
@@ -67,8 +63,7 @@ static inline uint64_t _arch_counter_get_cntvct(void)
/**
* vblk_get_req: Get a handle to free vsc request.
*/
static struct vsc_request *vblk_get_req(struct vblk_dev *vblkdev, unsigned int __data_len,
struct request *const bio_req)
static struct vsc_request *vblk_get_req(struct vblk_dev *vblkdev)
{
struct vsc_request *req = NULL;
unsigned long bit;
@@ -79,46 +74,7 @@ static struct vsc_request *vblk_get_req(struct vblk_dev *vblkdev, unsigned int _
bit = find_first_zero_bit(vblkdev->pending_reqs, vblkdev->max_requests);
if (bit < vblkdev->max_requests) {
req = &vblkdev->reqs[bit];
if ((!vblkdev->config.blk_config.use_vm_address && READ_WRITE_OR_IOCTL_OP)
|| (vblkdev->config.blk_config.use_vm_address
&& req_op(bio_req) == REQ_OP_DRV_IN
&& vblkdev->config.blk_config.req_ops_supported & VS_BLK_IOCTL_OP_F)) {
if (vblkdev->mempool_free > vblkdev->mempool_curr) {
if (vblkdev->mempool_free + 1 - vblkdev->mempool_curr
>= __data_len) {
req->mempool_virt = vblkdev->mempool_curr;
} else {
/* mempool is full, return to try later */
req = NULL;
goto exit;
}
} else if (vblkdev->mempool_free < vblkdev->mempool_curr) {
if (vblkdev->mempool_end - vblkdev->mempool_curr >= __data_len) {
req->mempool_virt = vblkdev->mempool_curr;
} else {
/* rollover if we do not have enough memory
* at last of mempool
*/
vblkdev->mempool_curr = vblkdev->mempool_start;
if (vblkdev->mempool_free + 1 - vblkdev->mempool_curr
>= __data_len) {
req->mempool_virt = vblkdev->mempool_curr;
} else {
/* mempool is full, return to try later */
req = NULL;
goto exit;
}
}
} else {
/* mempool is full, return to try later */
req = NULL;
goto exit;
}
}
req->vs_req.req_id = bit;
req->__data_len = __data_len;
set_bit(bit, vblkdev->pending_reqs);
vblkdev->inflight_reqs++;
mod_timer(&req->timer, jiffies + 30*HZ);
@@ -443,15 +399,6 @@ static bool complete_bio_req(struct vblk_dev *vblkdev)
goto bio_null;
}
if ((!vblkdev->config.blk_config.use_vm_address && READ_WRITE_OR_IOCTL_OP)
|| (vblkdev->config.blk_config.use_vm_address && req_op(bio_req) == REQ_OP_DRV_IN)) {
/* move to next slot in mempool */
if (vblkdev->mempool_free + 1 + vsc_req->__data_len > vblkdev->mempool_end)
vblkdev->mempool_free = vblkdev->mempool_start - 1;
vblkdev->mempool_free = vblkdev->mempool_free + vsc_req->__data_len;
}
bio_null:
vblk_put_req(vsc_req);
@@ -530,7 +477,6 @@ static enum blk_cmd_op cleanup_op_supported(struct vblk_dev *vblkdev, uint32_t o
*/
static bool submit_bio_req(struct vblk_dev *vblkdev)
{
struct vblk_ioctl_req *ioctl_req;
struct vsc_request *vsc_req = NULL;
struct request *bio_req = NULL;
struct vs_request *vs_req;
@@ -540,7 +486,7 @@ static bool submit_bio_req(struct vblk_dev *vblkdev)
void *buffer;
struct req_entry *entry = NULL;
size_t sz;
uint32_t sg_cnt, __data_len;
uint32_t sg_cnt;
uint32_t ops_supported = vblkdev->config.blk_config.req_ops_supported;
dma_addr_t sg_dma_addr = 0;
@@ -551,6 +497,10 @@ static bool submit_bio_req(struct vblk_dev *vblkdev)
if (vblkdev->queue == NULL)
goto bio_exit;
vsc_req = vblk_get_req(vblkdev);
if (vsc_req == NULL)
goto bio_exit;
spin_lock(&vblkdev->queue_lock);
if(!list_empty(&vblkdev->req_list)) {
entry = list_first_entry(&vblkdev->req_list, struct req_entry,
@@ -562,24 +512,8 @@ static bool submit_bio_req(struct vblk_dev *vblkdev)
spin_unlock(&vblkdev->queue_lock);
goto bio_exit;
}
bio_req = entry->req;
if (req_op(bio_req) != REQ_OP_DRV_IN) {
__data_len = bio_req->__data_len;
} else {
ioctl_req = (struct vblk_ioctl_req *)bio_req->completion_data;
__data_len = ioctl_req->ioctl_len;
}
vsc_req = vblk_get_req(vblkdev, __data_len, bio_req);
if (vsc_req == NULL) {
bio_req = NULL;
spin_unlock(&vblkdev->queue_lock);
goto bio_exit;
}
list_del(&entry->list_entry);
bio_req = entry->req;
kfree(entry);
}
spin_unlock(&vblkdev->queue_lock);
@@ -666,7 +600,7 @@ static bool submit_bio_req(struct vblk_dev *vblkdev)
if (!vblkdev->config.blk_config.use_vm_address) {
vs_req->blkdev_req.blk_req.data_offset =
vblkdev->mempool_curr - vblkdev->mempool_start;
vsc_req->mempool_offset;
} else {
vs_req->blkdev_req.blk_req.data_offset = 0;
/* Provide IOVA as part of request */
@@ -707,8 +641,6 @@ static bool submit_bio_req(struct vblk_dev *vblkdev)
}
}
} else {
vsc_req->mempool_offset = vblkdev->mempool_curr - vblkdev->mempool_start;
if (vblkdev->config.blk_config.req_ops_supported & VS_BLK_IOCTL_OP_F
&& !vblk_prep_ioctl_req(vblkdev,
(struct vblk_ioctl_req *)bio_req->completion_data,
@@ -733,12 +665,6 @@ static bool submit_bio_req(struct vblk_dev *vblkdev)
goto bio_exit;
}
if ((!vblkdev->config.blk_config.use_vm_address && READ_WRITE_OR_IOCTL_OP)
|| (vblkdev->config.blk_config.use_vm_address && req_op(bio_req) == REQ_OP_DRV_IN)) {
/* move to next slot in mempool */
vblkdev->mempool_curr = vblkdev->mempool_curr + __data_len;
}
return true;
bio_exit:
@@ -1108,12 +1034,6 @@ static void setup_device(struct vblk_dev *vblkdev)
tegra_hv_mempool_unreserve(vblkdev->ivmk);
return;
}
/* initialize initial pointers to go over mempool */
vblkdev->mempool_start = vblkdev->shared_buffer;
vblkdev->mempool_curr = vblkdev->shared_buffer;
vblkdev->mempool_free = vblkdev->shared_buffer + ivmk->size - 1;
vblkdev->mempool_end = vblkdev->shared_buffer + ivmk->size;
}
/* If IOVA feature is enabled for virt partition, then set max_requests
@@ -1129,7 +1049,7 @@ static void setup_device(struct vblk_dev *vblkdev)
max_ioctl_requests = MAX_VSC_REQS;
}
} else {
max_requests = vblkdev->ivck->nframes;
max_requests = ((vblkdev->ivmk->size) / max_io_bytes);
max_ioctl_requests = max_requests;
}
@@ -1192,6 +1112,17 @@ static void setup_device(struct vblk_dev *vblkdev)
for (req_id = 0; req_id < max_requests; req_id++){
req = &vblkdev->reqs[req_id];
if (vblkdev->config.blk_config.use_vm_address == 0U) {
req->mempool_virt = (void *)((uintptr_t)vblkdev->shared_buffer +
(uintptr_t)(req_id * max_io_bytes));
req->mempool_offset = (req_id * max_io_bytes);
} else {
if (vblkdev->config.blk_config.req_ops_supported & VS_BLK_IOCTL_OP_F) {
req->mempool_virt = (void *)((uintptr_t)vblkdev->shared_buffer +
(uintptr_t)((req_id % max_ioctl_requests) * max_io_bytes));
req->mempool_offset = (req_id % max_ioctl_requests) * max_io_bytes;
}
}
req->mempool_len = max_io_bytes;
req->id = req_id;
req->vblkdev = vblkdev;
@@ -1521,11 +1452,6 @@ static int tegra_hv_vblk_remove(struct platform_device *pdev)
tegra_hv_mempool_unreserve(vblkdev->ivmk);
}
vblkdev->mempool_start = NULL;
vblkdev->mempool_curr = NULL;
vblkdev->mempool_free = NULL;
vblkdev->mempool_end = NULL;
#if (IS_ENABLED(CONFIG_TEGRA_HSIERRRPTINJ))
if (vblkdev->epl_id == IP_SDMMC)
hsierrrpt_dereg_cb(vblkdev->epl_id, vblkdev->instance_id);

View File

@@ -48,7 +48,6 @@ struct vsc_request {
void *mempool_virt;
uint32_t mempool_offset;
uint32_t mempool_len;
uint32_t __data_len;
uint32_t id;
struct vblk_dev* vblkdev;
/* Scatter list for maping IOVA address */
@@ -107,12 +106,6 @@ struct vblk_dev {
struct mutex ivc_lock;
enum vblk_queue_state queue_state;
struct completion req_queue_empty;
/* mempools pointers to track the location */
void *mempool_start; /* representing start of mempool */
void *mempool_curr; /* representing current location in mempool */
void *mempool_free; /* representing free location in mempool */
void *mempool_end; /* representing end of mempool */
};
int vblk_complete_ioctl_req(struct vblk_dev *vblkdev,