On Thu, Dec 10, 2015 at 11:22:24AM -0800, Nelson Escobar wrote: > On 12/9/2015 10:47 PM, Leon Romanovsky wrote: > > On Wed, Dec 09, 2015 at 10:42:19AM -0800, Nelson Escobar wrote: > >> - if (usnic_vnic_res_free_cnt(vnic, type) < cnt || cnt < 1 || !owner) > >> + if (usnic_vnic_res_free_cnt(vnic, type) < cnt || cnt < 0 || !owner) > > Before this change you returned EINVAL if no free_cnt were available, > > now you will continue. is this behaviour expected? > Yes. If cnt is 0, then no resources are being requested, so it is OK if > there are no resources available. I afraid that you missed the point. Old code: usnic_vnic_res_free_cnt(vnic, type) == 0 and cnt == 1 will return EINVAL New code snic_vnic_res_free_cnt(vnic, type) == 0 and cnt == 1 will pass and will pass te "if (cnt > 0)" check below and will decrease free_cnt variable to be below zero.
Is this behavior expected? > > > >> return ERR_PTR(-EINVAL); > >> > >> ret = kzalloc(sizeof(*ret), GFP_ATOMIC); > >> @@ -247,26 +247,28 @@ usnic_vnic_get_resources(struct usnic_vnic *vnic, > >> enum usnic_vnic_res_type type, > >> return ERR_PTR(-ENOMEM); > >> } > >> > >> - ret->res = kzalloc(sizeof(*(ret->res))*cnt, GFP_ATOMIC); > >> - if (!ret->res) { > >> - usnic_err("Failed to allocate resources for %s. Out of > >> memory\n", > >> - usnic_vnic_pci_name(vnic)); > >> - kfree(ret); > >> - return ERR_PTR(-ENOMEM); > >> - } > >> + if (cnt > 0) { > >> + ret->res = kcalloc(cnt, sizeof(*(ret->res)), GFP_ATOMIC); > >> + if (!ret->res) { > >> + usnic_err("Failed to allocate resources for %s. Out of > >> memory\n", > >> + usnic_vnic_pci_name(vnic)); > > You don't need to print OOM messages, failure in memory allocation very > > hard to miss. > OOM messages are hard to miss, but this message is already in upstream > and outside the scope of this patch. It is worth to fix, especially if you are changing these exact lines. > >> + kfree(ret); > >> + return ERR_PTR(-ENOMEM); > >> + } > >> > >> - spin_lock(&vnic->res_lock); > >> - src = &vnic->chunks[type]; > >> - for (i = 0; i < src->cnt && ret->cnt < cnt; i++) { > >> - res = src->res[i]; > >> - if (!res->owner) { > >> - src->free_cnt--; > >> - res->owner = owner; > >> - ret->res[ret->cnt++] = res; > >> + spin_lock(&vnic->res_lock); > >> + src = &vnic->chunks[type]; > >> + for (i = 0; i < src->cnt && ret->cnt < cnt; i++) { > >> + res = src->res[i]; > >> + if (!res->owner) { > >> + src->free_cnt--; > > It will be negative, because of skip usnic_vnic_res_free_cnt check > > before. > We are inside the 'if (cnt > 0)' clause here, so the previous > usnic_vnic_res_free_cnt check wasn't skipped. See above. > >> + res->owner = owner; > >> + ret->res[ret->cnt++] = res; > >> + } > >> } > >> - } > >> > >> - spin_unlock(&vnic->res_lock); > >> + spin_unlock(&vnic->res_lock); > >> + } > >> ret->type = type; > >> ret->vnic = vnic; > >> WARN_ON(ret->cnt != cnt); > >> @@ -281,14 +283,16 @@ void usnic_vnic_put_resources(struct > >> usnic_vnic_res_chunk *chunk) > >> int i; > >> struct usnic_vnic *vnic = chunk->vnic; > >> > >> - spin_lock(&vnic->res_lock); > >> - while ((i = --chunk->cnt) >= 0) { > >> - res = chunk->res[i]; > >> - chunk->res[i] = NULL; > >> - res->owner = NULL; > >> - vnic->chunks[res->type].free_cnt++; > >> + if (chunk->cnt > 0) { > >> + spin_lock(&vnic->res_lock); > >> + while ((i = --chunk->cnt) >= 0) { > >> + res = chunk->res[i]; > >> + chunk->res[i] = NULL; > >> + res->owner = NULL; > >> + vnic->chunks[res->type].free_cnt++; > >> + } > >> + spin_unlock(&vnic->res_lock); > >> } > >> - spin_unlock(&vnic->res_lock); > >> > >> kfree(chunk->res); > >> kfree(chunk); > >> -- > >> 2.4.3 > >> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > >> the body of a message to majord...@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html