[openib-general] cm_copy_private_data() : BUG or feature ?
Sean Hefty
mshefty at ichips.intel.com
Tue Mar 21 08:58:15 PST 2006
Krishna Kumar2 wrote:
> Is cm_copy_private_data() intentionally returning NULL rather than, say
> something
> like, ERR_PTR(-EINVAL) ? The problem is that in the caller, a NULL ptr
> translates to
> success (0 > unsigned -1000), which might lead to errors in other code
> paths.
>
> Though from a cursory examination, I couldn't find any specific oops cases
> as
> private_data/len seem to be checked, but the problem is that this results
> in freeing
> up earlier allocated private_data through cm_set_private_data(), while the
> id state is
> ESTABLISHED. Hence looks like a bug to me.
The code should be correct. The purpose behind the routine is to 'squirrel
away' the user's private data in case it needs to be resent later. If the user
has no private data to send, then the 'copy' is NULL.
The CM must only maintain the private data for the last message sent. For
example, if the user sends an RTU, the CM copies the user's private data in case
the RTU needs to be resent. (In response to a duplicated REP.) If the user
sends a DREQ, the stored private data is replaced with the private data
associated with the DREQ.
The general operation is as follows:
1. Create a copy of the user's private data. This is done outside of holding
any spinlocks, with the assumption that the state machine works as expected.
2. Lock the cm_id.
3. Check the state of the cm_id and transition to the next state.
4. Update the private data for the new state. If there's no new private data to
send, we simply free the old data.
5. Unlock the cm_id.
Hope this helps.
- Sean
More information about the general
mailing list