> On Wed, 2017-05-03 at 19:27 +0300, Leon Romanovsky wrote: >> On Wed, May 03, 2017 at 07:01:14PM +0300, Sagi Grimberg wrote: >> > > As far as I know the compiler only does that for compile-time constants. In >> > > this case the divisor (max(queue_size / 2, 1)) is not a compile-time constant. >> > >> > We could theoretically do a (sig_count & max(queue_size / 2, 1)) but >> > that would only do well with power of 2 sized queues... >> >> IMHO, It is not-so-big-deal limitation. > > Hello Marta, Sagi and Leon, > > How about changing nvme_rdma_init_sig_count() such that it always returns > a power of two? The "+ 1" in the code below makes sure that the argument of > ilog2() is larger than zero even if queue_size == 1. I'm not sure whether > the time needed to compute ilog2() would make it necessary to cache the > nvme_rdma_init_sig_count() return value. > > static inline int nvme_rdma_init_sig_count(int queue_size) > { > /* Return the largest power of two that is not above half of (queue size + 1) */ > return 1 << ilog2((queue_size + 1) / 2); > } > > Bart. This looks like a good idea to me. Then the division can change into an AND. I'll come back with another version soon. Marta -- 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