Re: [PATCH v5 rdma-core 2/3] libhns: Support rq record doorbell

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2018/3/1 5:31, Jason Gunthorpe wrote:
> On Mon, Feb 26, 2018 at 04:40:41PM +0800, Yixian Liu wrote:
>> diff --git a/providers/hns/hns_roce_u.h b/providers/hns/hns_roce_u.h
>> index 0291246..8e9634a 100644
>> +++ b/providers/hns/hns_roce_u.h
>> @@ -39,6 +39,7 @@
>>  #include <infiniband/driver.h>
>>  #include <util/udma_barrier.h>
>>  #include <infiniband/verbs.h>
>> +#include <ccan/bitmap.h>
>>  #include <ccan/container_of.h>
>>  
>>  #define HNS_ROCE_CQE_ENTRY_SIZE		0x20
>> @@ -93,6 +94,24 @@ struct hns_roce_buf {
>>  	unsigned int			length;
>>  };
>>  
>> +/* the sw db length, on behalf of the qp/cq/srq length from left to right; */
>> +static const unsigned int db_size[] = {4, 4};
> 
> no static data in header files
> 
> This should also be something like
> 
> static const unsigned int db_size[] = {
> [HNS_ROCE_QP_TYPE_DB] = 4,
> [HNS_ROCE_CQ_TYPE_DB= = 4,
> };
> 
> For clarity
> 
>> +/* the sw doorbell type; */
>> +enum hns_roce_db_type {
>> +	HNS_ROCE_QP_TYPE_DB,
>> +	HNS_ROCE_CQ_TYPE_DB,
>> +	HNS_ROCE_DB_TYPE_NUM
>> +};
>> +
>> +struct hns_roce_db_page {
>> +	struct hns_roce_db_page	*prev, *next;
>> +	struct hns_roce_buf	buf;
>> +	unsigned int		num_db;
>> +	unsigned int		use_cnt;
>> +	bitmap			*bitmap;
>> +};
>> +
>>  struct hns_roce_context {
>>  	struct verbs_context		ibv_ctx;
>>  	void				*uar;
>> @@ -110,6 +129,10 @@ struct hns_roce_context {
>>  	int				num_qps;
>>  	int				qp_table_shift;
>>  	int				qp_table_mask;
>> +
>> +	struct hns_roce_db_page		*db_list[HNS_ROCE_DB_TYPE_NUM];
>> +	pthread_mutex_t			db_list_mutex;
>> +
>>  	unsigned int			max_qp_wr;
>>  	unsigned int			max_sge;
>>  	int				max_cqe;
>> @@ -188,12 +211,14 @@ struct hns_roce_qp {
>>  	unsigned int			sq_signal_bits;
>>  	struct hns_roce_wq		sq;
>>  	struct hns_roce_wq		rq;
>> +	unsigned int			*rdb;
> 
> Sure looks like this should be a uint32_t * ?
> 
>> +void hns_roce_free_db(struct hns_roce_context *ctx, unsigned int *db,
>> +		      enum hns_roce_db_type type)
>> +{
>> +	struct hns_roce_db_page *page;
>> +	uint32_t npos;
>> +	uint32_t page_size;
>> +
>> +	pthread_mutex_lock((pthread_mutex_t *)&ctx->db_list_mutex);
>> +
>> +	page_size = to_hr_dev(ctx->ibv_ctx.context.device)->page_size;
>> +	for (page = ctx->db_list[type]; page != NULL; page = page->next)
>> +		if (((uintptr_t)db & (~((uintptr_t)page_size - 1))) ==
>> +						(uintptr_t)(page->buf.buf))
>> +			goto found;
>> +
>> +	fprintf(stderr, "db page can't be found!\n");
>> +	goto out;
>> +
>> +found:
>> +	--page->use_cnt;
>> +	if (!page->use_cnt) {
>> +		if (page->prev)
>> +			page->prev->next = page->next;
>> +		else
>> +			ctx->db_list[type] = page->next;
>> +
>> +		if (page->next)
>> +			page->next->prev = page->prev;
>> +
>> +		hns_roce_clear_db_page(page);
>> +		free(page);
>> +		page = NULL;
> 
> Don't needlessly NULL things.
> 
>> +	if ((to_hr_dev(pd->context->device)->hw_version != HNS_ROCE_HW_VER1) &&
>> +	    attr->cap.max_recv_sge) {
>> +		qp->rdb = hns_roce_alloc_db(context, HNS_ROCE_QP_TYPE_DB);
>> +		if (!qp->rdb) {
>> +			fprintf(stderr, "alloc rdb buffer failed!\n");
> 
> No prints from drivers (all places).
> 
> Otherwise looks OK
> 
> Jason
> 

Thanks a lot, I will fix all the problems above.


--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux