mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 04:04:06 +00:00
[PATCH] IB/mthca: add mthca_table_find() function
Add mthca_table_find() function, which returns the lowmem address of an entry in a mem-free HCA's context tables. This will be used by the FMR implementation. Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <roland@topspin.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
b8ca06f674
commit
0fabd9fb7b
2 changed files with 35 additions and 0 deletions
|
@ -192,6 +192,40 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o
|
|||
up(&table->mutex);
|
||||
}
|
||||
|
||||
void *mthca_table_find(struct mthca_icm_table *table, int obj)
|
||||
{
|
||||
int idx, offset, i;
|
||||
struct mthca_icm_chunk *chunk;
|
||||
struct mthca_icm *icm;
|
||||
struct page *page = NULL;
|
||||
|
||||
if (!table->lowmem)
|
||||
return NULL;
|
||||
|
||||
down(&table->mutex);
|
||||
|
||||
idx = (obj & (table->num_obj - 1)) * table->obj_size;
|
||||
icm = table->icm[idx / MTHCA_TABLE_CHUNK_SIZE];
|
||||
offset = idx % MTHCA_TABLE_CHUNK_SIZE;
|
||||
|
||||
if (!icm)
|
||||
goto out;
|
||||
|
||||
list_for_each_entry(chunk, &icm->chunk_list, list) {
|
||||
for (i = 0; i < chunk->npages; ++i) {
|
||||
if (chunk->mem[i].length >= offset) {
|
||||
page = chunk->mem[i].page;
|
||||
break;
|
||||
}
|
||||
offset -= chunk->mem[i].length;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
up(&table->mutex);
|
||||
return page ? lowmem_page_address(page) + offset : NULL;
|
||||
}
|
||||
|
||||
int mthca_table_get_range(struct mthca_dev *dev, struct mthca_icm_table *table,
|
||||
int start, int end)
|
||||
{
|
||||
|
|
|
@ -85,6 +85,7 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev,
|
|||
void mthca_free_icm_table(struct mthca_dev *dev, struct mthca_icm_table *table);
|
||||
int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int obj);
|
||||
void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int obj);
|
||||
void *mthca_table_find(struct mthca_icm_table *table, int obj);
|
||||
int mthca_table_get_range(struct mthca_dev *dev, struct mthca_icm_table *table,
|
||||
int start, int end);
|
||||
void mthca_table_put_range(struct mthca_dev *dev, struct mthca_icm_table *table,
|
||||
|
|
Loading…
Add table
Reference in a new issue