Sean Hefty wrote:
This patchset adds support for the following enhanced atomic operations:
- Masked atomic compare and swap
- Masked atomic fetch and add

Can you explain these in more detail?  How exactly is a mask used?  Are there
any restrictions on the format of the mask?  How is the mask carried over the
wire?  etc.

--

Masked Compare and Swap (MskCmpSwap)
The MskCmpSwap atomic operation is an extension to the CmpSwap operation 
defined in the IB
spec. MskCmpSwap allows the user to select a portion of the 64 bit target data 
for the “compare”
check as well as to restrict the swap to a (possibly different) portion. The 
pseudo code below
describes the operation:

-----
atomic_response = *va
if (((cmp XOR *va) AND cmp_mask) is ZERO) then
        *va = (*va AND NOT(swap_mask)) OR (swap AND swap_mask)

return atomic_response
-----

The additional operands are carried in the Extended Transport Header. Atomic 
response generation
and packet format for MskCmpSwap is as for standard IB Atomic operations.


Masked Fetch and Add (MFetchAdd)
The MFetchAdd Atomic operation extends the functionality of the standard IB 
FetchAdd by
allowing the user to split the target into multiple fields of selectable 
length. The atomic add is done
independently on each one of this fields. A bit set in the field_boundary 
parameter specifies the
field boundaries. The pseudo code below describes the operation:

------------
bit_adder(ci, b1, b2, *co)
{
        value = ci + b1 + b2;

        if (value & 2)
                *co = 1
        else
                *co = 0

        return value & 1
}

mask = 1
carry = 0
atomic_response = *va
#define MASK_IS_SET(mask, attr)      (((mask)&(attr))!=0)

for i = 0 to 63
{
        if ( i != 0 )
                mask =  mask << 1;

        bit_add_res = bit_adder(carry, MASK_IS_SET(atomic_response, mask), 
MASK_IS_SET(add_value, mask), &new_carry)
        if (bit_add_res)
                atomic_response |= mask

        carry = ((new_carry) && (!MASK_IS_SET(cmp_mask, mask)))
}

return atomic_response
------------

The additional operands are carried in the Extended Transport Header. Atomic 
response generation
and packet format for MFetchAdd is as for standard IB Atomic operations.

Regards,
Vladimir
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to