Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UCP: add support fixed address for mmap #1329

Merged
merged 3 commits into from
Mar 7, 2017

Conversation

evgeny-leksikov
Copy link
Contributor

@evgeny-leksikov evgeny-leksikov commented Feb 15, 2017

Fixes #1273
Do not merge before #1323
@shssf , @brminich pls review, note that several commits (UCT part) are already reviewed in #1323

@yosefe yosefe added the WIP-DNM Work in progress / Do not review label Feb 15, 2017
@evgeny-leksikov
Copy link
Contributor Author

@MattBBaker please share ORNL failures

Copy link
Contributor

@brminich brminich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure that I checked all relevant commits, but tried to look thru UCP related

UCP_MEM_MAP_ALLOCATE = UCS_BIT(2) /**< Identify requirement for allocation,
if passed address is not a null-pointer
then it will be used as a hint or direct
address for allocation depend */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like incomplete sentence

@@ -142,14 +143,18 @@ static ucs_status_t ucp_mem_alloc(ucp_context_h context, size_t length,
* name specified in the configuration.
*/
num_mds = 0;
if (method == UCT_ALLOC_METHOD_MD) {
if ((method == UCT_ALLOC_METHOD_MD)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need for extra brackets

return flags;
}

/* Matrix of behavior
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks cool as a comment!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't it better to have this matrix in the ucp.h ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alex-mikheev I've added such kind of the table to ucp.h as a markdown table. It's unreadable in the code but should look fine in the browser. I decided to keep this one "as is" for development needs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might use @verbatim clause for this type of comments. Please look into uct_def.h

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand verbatim does not support hyperlinks, doesn't it? The resulting table includes links to all actual fields and flags.


/* Now, lets check all erroneous cases from the matrix */
if (params->address == NULL) {
if (params->flags == 0) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these checks can be reduced to smth like this:

if ((params->flags & UCP_MEM_MAP_FIXED) ||
!(params->flags & UCP_MEM_MAP_ALLOCATE)) {
return UCS_ERR_INVALID_PARAM;
}

(params->flags & UCP_MEM_MAP_FIXED)) {
return UCS_ERR_INVALID_PARAM;
}
} else if (!(params->flags & UCP_MEM_MAP_ALLOCATE) &&
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is this an invalid param case?

@@ -170,6 +173,10 @@ void test_ucp_memheap::test_blocking_xfer(blocking_send_func_t send,
goto out;
}

if (!malloc_allocate) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can set it in the check above at line 162 (though flags needs to be initialized before that check)

@MattBBaker
Copy link
Contributor

cc1plus: warnings being treated as errors
/var/lib/jenkins/jobs/UCX/workspace/contrib/../test/gtest/ucp/test_ucp_memheap.cc: In member function ‘void test_ucp_memheap::test_blocking_xfer(void (test_ucp_memheap::*)(ucp_test_base::entity*, size_t, void*, ucp_rkey*, std::string&), size_t, int, size_t, bool, bool)’:
/var/lib/jenkins/jobs/UCX/workspace/contrib/../test/gtest/ucp/test_ucp_memheap.cc:151: error: ‘memheap’ may be used uninitialized in this function
make[2]: *** [ucp/gtest-test_ucp_memheap.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory `/var/lib/jenkins/jobs/UCX/workspace/build-tests/test/gtest'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/var/lib/jenkins/jobs/UCX/workspace/build-tests'
make: *** [all] Error 2

It's because memheap doesn't get set until line 172, but in line 166 there is a 'goto out;' statement that will lead to a code path that passes memheap to free(), so at that point memheap won't be initialized. Setting memheap = NULL at initialization in line 151 will fix this.

@evgeny-leksikov
Copy link
Contributor Author

@MattBBaker Thanks! This is a new error, the same as Mellanox testing shows, It should be fixed now. Yesterday's PR has something else (https://pod9.ccs.ornl.gov/job/UCX/865/)

@yosefe yosefe added API Feature New feature and removed WIP-DNM Work in progress / Do not review labels Feb 17, 2017
* @param [out] params Defined @ref ucp_mem_map_params_t configurations
* for the @ref ucp_mem_h "UCP memory handle".
*/
ucs_status_t ucp_mem_query(const ucp_mem_h memh, ucp_mem_map_params_t *params);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the query function should return a new structure (not ucp_mem_map_params_t), according to the convention it would be ucp_mem_attr_t.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need this function ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add @return


static inline int ucp_mem_map_is_allocate(ucp_mem_map_params_t *params)
{
ucs_assert(params != NULL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don;t think this assert is needed

@@ -178,20 +178,96 @@ static ucs_status_t ucp_mem_alloc(ucp_context_h context, size_t length,
}


static inline unsigned uct_flags(ucp_mem_map_params_t *params)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pls rename the function

{
unsigned flags = 0;

if (params && (params->field_mask & UCP_MEM_MAP_PARAM_FIELD_FLAGS)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need to check for params!=NULL

*/
static inline ucs_status_t ucp_mem_map_check_and_adjust_params(ucp_mem_map_params_t *params)
{
if (!params) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need to check this

UCP_MEM_MAP_FIXED = UCS_BIT(1), /**< Don't interpret addr as a hint:
place the mapping at exactly that
address. See man mmap for details */
UCP_MEM_MAP_ALLOCATE = UCS_BIT(2) /**< Identify requirement for allocation,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pls reverse order, ALLOCATE flag should come before FIXED

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is not clear how UCP_MEM_MAP_NONBLOCK interacts with the UCP_MEM_MAP_ALLOCATE. You need to clarify if nonblock is good for mapping (registration), for allocation or for both

address. See man mmap for details */
UCP_MEM_MAP_ALLOCATE = UCS_BIT(2) /**< Identify requirement for allocation,
if passed address is not a null-pointer
then it will be used as a hint or direct
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIRC address-as-a-hint is not implemented by UCT today, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's implemented, we added address argument to uct_mem_alloc function for that


/* First of all, define all fields */
if (!(params->field_mask & UCP_MEM_MAP_PARAM_FIELD_ADDRESS)) {
params->field_mask |= UCP_MEM_MAP_PARAM_FIELD_ADDRESS;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pls avoid changing the structure passed by user. Need to make the parameter to ucp_mem_map() a const*.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, now the copy user's structure is changing to simplify definition of default and erroneous cases

}
} else if (!(params->flags & UCP_MEM_MAP_ALLOCATE) &&
(params->flags & UCP_MEM_MAP_FIXED)) {
return UCS_ERR_INVALID_PARAM;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indentation

}

params->field_mask = 0;
return UCS_ERR_INVALID_PARAM;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this function should not return UCS_ERR_INVALID_PARAM

up-front, and mapping them later when
they are accessed by communication
routines. */
UCP_MEM_MAP_FIXED = UCS_BIT(1), /**< Don't interpret addr as a hint:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

^addr^address

* @param [out] params Defined @ref ucp_mem_map_params_t configurations
* for the @ref ucp_mem_h "UCP memory handle".
*/
ucs_status_t ucp_mem_query(const ucp_mem_h memh, ucp_mem_map_params_t *params);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need this function ?

* @brief query mapped memory segment
*
* This routine returns valid address and length of memory segment mapped with
* @ref ucp_mem_map "ucp_mem_map()" routine.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove 'valid'

* @param [out] params Defined @ref ucp_mem_map_params_t configurations
* for the @ref ucp_mem_h "UCP memory handle".
*/
ucs_status_t ucp_mem_query(const ucp_mem_h memh, ucp_mem_map_params_t *params);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add @return

return flags;
}

/* Matrix of behavior
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't it better to have this matrix in the ucp.h ?

UCP_MEM_MAP_FIXED = UCS_BIT(1), /**< Don't interpret addr as a hint:
place the mapping at exactly that
address. See man mmap for details */
UCP_MEM_MAP_ALLOCATE = UCS_BIT(2) /**< Identify requirement for allocation,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is not clear how UCP_MEM_MAP_NONBLOCK interacts with the UCP_MEM_MAP_ALLOCATE. You need to clarify if nonblock is good for mapping (registration), for allocation or for both

@alex-mikheev
Copy link
Contributor

@evgeny-leksikov @yosefe
I want to clarify a usage pattern:

  1. allocate memory with ALLOCATE flags. In return i qam getting a mem handle
  2. map the memory. I am getting another mem handle

Is it OK to free handles in the reverse order ?

@yosefe
Copy link
Contributor

yosefe commented Feb 26, 2017

@alex-mikheev in general there is no need to map a memory which was allocated by ucp.
However, if indeed you do it, you cannot release in reverse order. because releasing memh(1) would also release the memory, and you should not release memory before unmapping it [e.g release memh(2)]

@alex-mikheev
Copy link
Contributor

The docs in this PR suggest that allocated memory is not mapped

@yosefe
Copy link
Contributor

yosefe commented Feb 26, 2017

@evgeny-leksikov need to explicitly specify that memory allocated by ucp_mem_map() is available for RMAs and AMOs

@evgeny-leksikov
Copy link
Contributor Author

@alex--m @yosefe it's described in existing docs for ucp_mem_map:

Map or allocate memory for zero-copy operations

and

If a large segment is registered, and then segmented for subsequent use by a user, then the user is responsible for segmentation and subsequent management

@alex-mikheev
Copy link
Contributor

@evgeny-leksikov It is not clear if the allocated memory is also mapped. In fact based on the table in the comment one has a reason to think that allocated memory is not mapped/registered

@evgeny-leksikov
Copy link
Contributor Author

@alex-mikheev I see your point. This table is a comment for internal function, not API, so it should not be considered as a user's documentation. Any way, I'll fix alloc -> alloc/reg int the table, that's OK?

@yosefe
Copy link
Contributor

yosefe commented Feb 27, 2017

@evgeny-leksikov we need to put a more comprehensive explanation in the UCP level, can be a similar table (but something which looks good on doxygen), or something else which clearly explains what are the valid combinations of flags, and what would happen for each.

@evgeny-leksikov
Copy link
Contributor Author

PR is updated to cover the most of comments and especially API, I'm going to update ucp_mem_map docs a bit later


status = ucp_mem_map(perf->ucp.context, &mem_map_params,
&perf->ucp.send_memh);
if (status != UCS_OK) {
goto err;
}
perf->send_buffer = mem_map_params.address;
status = ucp_mem_query(perf->ucp.send_memh, &mem_attr);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pls add space line

ucs_status_t ucp_mem_query(const ucp_mem_h memh, ucp_mem_attr_t *attr)
{
if (memh->address) {
attr->field_mask = UCP_MEM_ATTR_FIELD_ADDRESS |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the field mask is an input parameter, specifying which fields should be filled by the structure.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i.e. attr should be in/out parameter?
This looks more flexible but requires a bit more actions from user.
And what the function should return if requested field, for example, is not available? UCS_ERR_UNSUPPORTED?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, see ucp_worker_query for example.
if not available - currently it's not handled correctly (good catch)
I guess we need to return ERR_INVALID_PARAM if any unexpected bit is received in attr.field_mask. but let's do it in another PR, and for all ucp_*_query() functions?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, but I like UNSUPPORTED more from perspective that field_flags introduced for backward compatibility. This might be actual for ucp*params functions as well

uint64_t field_mask;

/**
* A virtual address.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Address of the memory segment

@@ -115,6 +115,44 @@ typedef struct ucp_mem *ucp_mem_h;


/**
* @ingroup UCP_MEM
* @brief Attributes of the @ref ucp_mem_h "UCP Memory handle", might be
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"might be requested by" -> "filled by"

/* Now, lets check the rest of erroneous cases from the matrix */
if (params->address == NULL) {
if (!(params->flags & UCP_MEM_MAP_ALLOCATE)) {
return UCS_ERR_INVALID_PARAM;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shall we add error message, as in line 233?

ucp_mem_h memh;
ucp_mem_map_params_t mem_params;

if (!params) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMHO no need to check for params==NULL since we don't check it in any other function

if (params->address == NULL) {
status = ucp_mem_alloc(context, params->length, uct_flags, "user allocation", memh);
if (ucp_mem_map_is_allocate(&mem_params)) {
status = ucp_mem_alloc(context, mem_params.length,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's add debug message like in line 303

@@ -237,6 +237,12 @@ size_t ucs_get_page_size();


/**
* @return 1 if ptr is aligned to page size on the system, otherwise 0
*/
int ucs_is_page_aligned(void *ptr);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to remove

EXPECT_TRUE(mem_attr.field_mask & (UCP_MEM_ATTR_FIELD_ADDRESS |
UCP_MEM_ATTR_FIELD_LENGTH));
EXPECT_LE(memheap_size, mem_attr.length);
if (!memheap) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not memheap = mem_attr.address unconditionally?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because if memheap allocated by malloc then mem_attr.address may different in common case, I'm not sure that the test will work fine everywhere :) Are you suggesting to remove the check?

ASSERT_UCS_OK(status);

free(memheap);
if (!(params.flags & UCP_MEM_MAP_ALLOCATE)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMHO would be better to use GetParam().variant than params.flags

@yosefe
Copy link
Contributor

yosefe commented Feb 28, 2017

@evgeny-leksikov can you please also squash the commits?

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://bgate.mellanox.com/jenkins/job/gh-ucx-pr/1069/ for details.

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://hpc-master.lab.mtl.com:8080/job/hpc-ucx-pr/3021/ for details (Mellanox internal link).

@evgeny-leksikov
Copy link
Contributor Author

All comments are addressed. @yosefe , @alex-mikheev , pls review

@yosefe
Copy link
Contributor

yosefe commented Mar 1, 2017

@shamisp @bbenton @alex-mikheev pls review as well

* <td>@ref anch_alloc_hint_reg "alloc+register,hint"
* <td>@ref anch_err "error"
* <td>@ref anch_alloc_fixed_reg "alloc+register,fixed"
* </table>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When converted to pdf, this table has some formatting and alignment issues. Maybe using shorter names to print in the references to the parameter flags will help. If it could look more like the ASCII matrix in ucp_mm.c, I think that would help for readability.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bbenton formatting for PDF is a pain.
The table is too wide without abbreviations even in ASCII and it doesn't support hyperlinks to provide good description and navigation.
I've prepared 3 different variants of the table, please take patch here and choose the best one from your point of view. If you would play with it and provide better formatting, it would be very appreciated!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for re-working the table and providing the 3 options. I prefer the 2nd option; I think it is much cleaner in the pdf. I have a couple of minor suggested modifications:

  1. change the NONBLOCK column text from
    affects only\n registration/mapping\n phase
    to
    only affects the\n register/map\n phase
    this keeps the text from overflowing the column width

  2. for the "address" column, modify the "1" value to "defined", as in table 3.

if ((params->flags & UCP_MEM_MAP_FIXED) &&
(!params->address ||
((uintptr_t)params->address % ucs_get_page_size()))) {
ucs_error("UCP_MEM_MAP_FIXED flag requires page aligned address");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The requirement for fix address page alignment has to be explicitly document in UCP API.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

/* TODO: pass addr */
status = uct_mem_alloc(NULL, length, uct_flags, &method, 1, mds, num_mds,
name, &mem);
status = uct_mem_alloc(memh->address, length, uct_flags, &method, 1, mds,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mmap does not guarantee allocation with user defined address. Do we have an error code to propagate it to UCP later. The fact that we can't guarantee such allocation has to be explicitly mentioned in UCP documentation

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shamisp I'm not sure I see you point
man mmap for MAP_FIXED flag says me a bit different things: it's less portable, overlapped parts will be discarded, etc. but it does. If the addr can't be used, mmap will fail, so ucp_mem_map should return NO_MEMORY.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shamisp the API doc says "use address as a hint". If the memory is allocated in a different address - user can find this using ucp_mem_query(), it is not considered an error situation.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return NO_MEMORY - answers the question

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but the memory allocation did succeed, just not in address provided as hint..

Copy link
Contributor

@shamisp shamisp Mar 3, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay...how we notify user about this ? We don't want a user to invoke the query every single allocation.

Copy link
Contributor

@yosefe yosefe Mar 3, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems like there are 2 options:

  1. return error code
  2. return success, user does mem_query

I think (2) is better because:

  1. similar behavior to system mmap
  2. error status usually means no side effect happened, but here memory was allocated
  3. user who wants to force specific address can use FIXED flag. otherwise, he has to query anyway to discover the real address.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with the idea of following mmap semantics. If UCP_MEM_MAP_FIXED was specified UCP should fail and return an error.

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://bgate.mellanox.com/jenkins/job/gh-ucx-pr/1096/ for details.

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://hpc-master.lab.mtl.com:8080/job/hpc-ucx-pr/3037/ for details (Mellanox internal link).

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://bgate.mellanox.com/jenkins/job/gh-ucx-pr/1106/ for details.

@evgeny-leksikov
Copy link
Contributor Author

@shamisp looks like all issues are resolved. Do you have other comments?

@@ -262,7 +262,8 @@ enum {
address for allocation. */
UCP_MEM_MAP_FIXED = UCS_BIT(2) /**< Don't interpret address as a hint:
place the mapping at exactly that
address. */
address. Address must be a multiple
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The address

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evgeny-leksikov once you make the chance consider that it is auto-approved by me :) but you have to get approval from @bbenton as well.

@shamisp
Copy link
Contributor

shamisp commented Mar 6, 2017

@evgeny-leksikov - just one minor comment and we may call it done.

@bbenton
Copy link
Contributor

bbenton commented Mar 7, 2017

👍 for doc/api

@evgeny-leksikov
Copy link
Contributor Author

Rebased on master to resolve conflicts

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://bgate.mellanox.com/jenkins/job/gh-ucx-pr/1121/ for details.

@mellanox-github
Copy link
Contributor

Test FAILed.
See http://hpc-master.lab.mtl.com:8080/job/hpc-ucx-pr/3055/ for details (Mellanox internal link).

@evgeny-leksikov
Copy link
Contributor Author

bot:mlx:retest

@mellanox-github
Copy link
Contributor

Test PASSed.
See http://hpc-master.lab.mtl.com:8080/job/hpc-ucx-pr/3057/ for details (Mellanox internal link).

@shamisp shamisp merged commit ce7508e into openucx:master Mar 7, 2017
@evgeny-leksikov evgeny-leksikov deleted the mmap_fixed_ucp branch March 7, 2017 15:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants