HFI1: use generic kmalloc cache for user_sdma_txreqs and req tids
This commit is contained in:
@ -743,6 +743,10 @@ int hfi1_map_device_addresses(struct hfi1_filedata *fd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct kmalloc_cache_header tids_cache = {NULL};
|
||||||
|
|
||||||
|
#undef PROFILE_ENABLE
|
||||||
|
|
||||||
#ifdef __HFI1_ORIG__
|
#ifdef __HFI1_ORIG__
|
||||||
int hfi1_user_sdma_process_request(struct file *fp, struct iovec *iovec,
|
int hfi1_user_sdma_process_request(struct file *fp, struct iovec *iovec,
|
||||||
unsigned long dim, unsigned long *count)
|
unsigned long dim, unsigned long *count)
|
||||||
@ -970,7 +974,8 @@ int hfi1_user_sdma_process_request(void *private_data, struct iovec *iovec,
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto free_req;
|
goto free_req;
|
||||||
}
|
}
|
||||||
req->tids = kcalloc(ntids, sizeof(*req->tids), GFP_KERNEL);
|
req->tids = kmalloc_cache_alloc(&tids_cache,
|
||||||
|
sizeof(*req->tids) * MAX_TID_PAIR_ENTRIES);
|
||||||
if (!req->tids) {
|
if (!req->tids) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto free_req;
|
goto free_req;
|
||||||
@ -1163,48 +1168,7 @@ static inline u32 get_lrh_len(struct hfi1_pkt_header hdr, u32 len)
|
|||||||
return ((sizeof(hdr) - sizeof(hdr.pbc)) + 4 + len);
|
return ((sizeof(hdr) - sizeof(hdr.pbc)) + 4 + len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ihk_spinlock_t txreq_cache_lock = 0;
|
struct kmalloc_cache_header txreq_cache = {NULL};
|
||||||
static LIST_HEAD(txreq_cache_list);
|
|
||||||
|
|
||||||
struct user_sdma_txreq *txreq_cache_alloc(void)
|
|
||||||
{
|
|
||||||
struct user_sdma_txreq *req = NULL;
|
|
||||||
|
|
||||||
ihk_mc_spinlock_lock_noirq(&txreq_cache_lock);
|
|
||||||
retry:
|
|
||||||
if (!list_empty(&txreq_cache_list)) {
|
|
||||||
req = list_first_entry(&txreq_cache_list,
|
|
||||||
struct user_sdma_txreq, list);
|
|
||||||
list_del(&req->list);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int i;
|
|
||||||
kprintf("%s: cache empty, allocating ...\n", __FUNCTION__);
|
|
||||||
for (i = 0; i < 100; ++i) {
|
|
||||||
req = kmalloc(sizeof(struct user_sdma_txreq), GFP_KERNEL);
|
|
||||||
if (!req) {
|
|
||||||
kprintf("%s: ERROR: allocating txreq\n", __FUNCTION__);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
list_add_tail(&req->list, &txreq_cache_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
ihk_mc_spinlock_unlock_noirq(&txreq_cache_lock);
|
|
||||||
|
|
||||||
return req;
|
|
||||||
}
|
|
||||||
|
|
||||||
void txreq_cache_free(struct user_sdma_txreq *req)
|
|
||||||
{
|
|
||||||
ihk_mc_spinlock_lock_noirq(&txreq_cache_lock);
|
|
||||||
list_add_tail(&req->list, &txreq_cache_list);
|
|
||||||
ihk_mc_spinlock_unlock_noirq(&txreq_cache_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef PROFILE_ENABLE
|
|
||||||
|
|
||||||
static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
|
static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
|
||||||
{
|
{
|
||||||
@ -1265,8 +1229,7 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
|
|||||||
}
|
}
|
||||||
tx = kmem_cache_alloc(pq->txreq_cache, GFP_KERNEL);
|
tx = kmem_cache_alloc(pq->txreq_cache, GFP_KERNEL);
|
||||||
#else
|
#else
|
||||||
//tx = kmalloc(sizeof(struct user_sdma_txreq), GFP_KERNEL);
|
tx = kmalloc_cache_alloc(&txreq_cache, sizeof(*tx));
|
||||||
tx = txreq_cache_alloc();
|
|
||||||
#endif /* __HFI1_ORIG__ */
|
#endif /* __HFI1_ORIG__ */
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
profile_event_add(PROFILE_sdma_1,
|
profile_event_add(PROFILE_sdma_1,
|
||||||
@ -1558,7 +1521,7 @@ free_tx:
|
|||||||
kmem_cache_free(pq->txreq_cache, tx);
|
kmem_cache_free(pq->txreq_cache, tx);
|
||||||
hfi1_cdbg(AIOWRITE, "-");
|
hfi1_cdbg(AIOWRITE, "-");
|
||||||
#else
|
#else
|
||||||
kfree(tx);
|
kmalloc_cache_free(&txreq_cache, tx);
|
||||||
#endif /* __HFI1_ORIG__ */
|
#endif /* __HFI1_ORIG__ */
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1982,8 +1945,7 @@ static void user_sdma_txreq_cb(struct sdma_txreq *txreq, int status)
|
|||||||
#ifdef __HFI1_ORIG__
|
#ifdef __HFI1_ORIG__
|
||||||
kmem_cache_free(pq->txreq_cache, tx);
|
kmem_cache_free(pq->txreq_cache, tx);
|
||||||
#else
|
#else
|
||||||
//kfree(tx);
|
kmalloc_cache_free(&txreq_cache, tx);
|
||||||
txreq_cache_free(tx);
|
|
||||||
#endif /* __HFI1_ORIG__ */
|
#endif /* __HFI1_ORIG__ */
|
||||||
tx = NULL;
|
tx = NULL;
|
||||||
|
|
||||||
@ -2031,8 +1993,7 @@ static void user_sdma_free_request(struct user_sdma_request *req, bool unpin)
|
|||||||
#ifdef __HFI1_ORIG__
|
#ifdef __HFI1_ORIG__
|
||||||
kmem_cache_free(req->pq->txreq_cache, tx);
|
kmem_cache_free(req->pq->txreq_cache, tx);
|
||||||
#else
|
#else
|
||||||
//kfree(tx);
|
kmalloc_cache_free(&txreq_cache, tx);
|
||||||
txreq_cache_free(tx);
|
|
||||||
#endif /* __HFI1_ORIG__ */
|
#endif /* __HFI1_ORIG__ */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2055,7 +2016,7 @@ static void user_sdma_free_request(struct user_sdma_request *req, bool unpin)
|
|||||||
#endif /* __HFI1_ORIG__ */
|
#endif /* __HFI1_ORIG__ */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kfree(req->tids);
|
kmalloc_cache_free(&tids_cache, req->tids);
|
||||||
clear_bit(req->info.comp_idx, req->pq->req_in_use);
|
clear_bit(req->info.comp_idx, req->pq->req_in_use);
|
||||||
hfi1_cdbg(AIOWRITE, "-");
|
hfi1_cdbg(AIOWRITE, "-");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user