Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F135409665
D3835.id9213.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
72 KB
Referenced Files
None
Subscribers
None
D3835.id9213.diff
View Options
Index: sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
===================================================================
--- sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
+++ sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
@@ -606,18 +606,16 @@
#define MPA_V2_RDMA_READ_RTR 0x4000
#define MPA_V2_IRD_ORD_MASK 0x3FFF
-/* Fixme: Use atomic_read for kref.count as same as Linux */
#define c4iw_put_ep(ep) { \
CTR4(KTR_IW_CXGBE, "put_ep (%s:%u) ep %p, refcnt %d", \
- __func__, __LINE__, ep, (ep)->kref.count); \
- WARN_ON((ep)->kref.count < 1); \
+ __func__, __LINE__, ep, atomic_read(&(ep)->kref.refcount)); \
+ WARN_ON(atomic_read(&(ep)->kref.refcount) < 1); \
kref_put(&((ep)->kref), _c4iw_free_ep); \
}
-/* Fixme: Use atomic_read for kref.count as same as Linux */
#define c4iw_get_ep(ep) { \
CTR4(KTR_IW_CXGBE, "get_ep (%s:%u) ep %p, refcnt %d", \
- __func__, __LINE__, ep, (ep)->kref.count); \
+ __func__, __LINE__, ep, atomic_read(&(ep)->kref.refcount)); \
kref_get(&((ep)->kref)); \
}
Index: sys/dev/cxgbe/iw_cxgbe/qp.c
===================================================================
--- sys/dev/cxgbe/iw_cxgbe/qp.c
+++ sys/dev/cxgbe/iw_cxgbe/qp.c
@@ -1257,8 +1257,7 @@
case C4IW_QP_STATE_RTS:
switch (attrs->next_state) {
case C4IW_QP_STATE_CLOSING:
- //Fixme: Use atomic_read as same as Linux
- BUG_ON(qhp->ep->com.kref.count < 2);
+ BUG_ON(atomic_read(&qhp->ep->com.kref.refcount) < 2);
set_state(qhp, C4IW_QP_STATE_CLOSING);
ep = qhp->ep;
if (!internal) {
Index: sys/ofed/drivers/infiniband/core/cma.c
===================================================================
--- sys/ofed/drivers/infiniband/core/cma.c
+++ sys/ofed/drivers/infiniband/core/cma.c
@@ -2400,10 +2400,9 @@
{
struct rdma_id_private *cur_id;
struct sockaddr *addr, *cur_addr;
- struct hlist_node *node;
addr = (struct sockaddr *) &id_priv->id.route.addr.src_addr;
- hlist_for_each_entry(cur_id, node, &bind_list->owners, node) {
+ hlist_for_each_entry(cur_id, &bind_list->owners, node) {
if (id_priv == cur_id)
continue;
Index: sys/ofed/drivers/infiniband/core/fmr_pool.c
===================================================================
--- sys/ofed/drivers/infiniband/core/fmr_pool.c
+++ sys/ofed/drivers/infiniband/core/fmr_pool.c
@@ -118,14 +118,13 @@
{
struct hlist_head *bucket;
struct ib_pool_fmr *fmr;
- struct hlist_node *pos;
if (!pool->cache_bucket)
return NULL;
bucket = pool->cache_bucket + ib_fmr_hash(*page_list);
- hlist_for_each_entry(fmr, pos, bucket, cache_node)
+ hlist_for_each_entry(fmr, bucket, cache_node)
if (io_virtual_address == fmr->io_virtual_address &&
page_list_len == fmr->page_list_len &&
!memcmp(page_list, fmr->page_list,
Index: sys/ofed/drivers/infiniband/core/uverbs_main.c
===================================================================
--- sys/ofed/drivers/infiniband/core/uverbs_main.c
+++ sys/ofed/drivers/infiniband/core/uverbs_main.c
@@ -1168,7 +1168,7 @@
if (!dev)
return -ENODEV;
- return sprintf(buf, "%d\n", dev->ref.count);
+ return sprintf(buf, "%d\n", atomic_read(&dev->ref.refcount));
}
static DEVICE_ATTR(ref_cnt, S_IRUGO, show_dev_ref_cnt, NULL);
Index: sys/ofed/drivers/infiniband/hw/mlx4/main.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mlx4/main.c
+++ sys/ofed/drivers/infiniband/hw/mlx4/main.c
@@ -2556,7 +2556,7 @@
}
err_map:
- iounmap(ibdev->priv_uar.map);
+ iounmap(ibdev->priv_uar.map, PAGE_SIZE);
mlx4_ib_free_eqs(dev, ibdev);
err_uar:
@@ -2679,7 +2679,7 @@
pr_warn("failure unregistering notifier\n");
ibdev->iboe.nb.notifier_call = NULL;
}
- iounmap(ibdev->priv_uar.map);
+ iounmap(ibdev->priv_uar.map, PAGE_SIZE);
for (p = 0; p < ibdev->num_ports; ++p) {
if (mlx4_ib_port_link_layer(&ibdev->ib_dev, p + 1) ==
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_av.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_av.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_av.c
@@ -368,7 +368,8 @@
return;
if (dev->av_table.av_map)
- iounmap(dev->av_table.av_map);
+ iounmap(dev->av_table.av_map,
+ dev->av_table.num_ddr_avs * MTHCA_AV_SIZE);
pci_pool_destroy(dev->av_table.pool);
mthca_alloc_cleanup(&dev->av_table.alloc);
}
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_catas.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_catas.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_catas.c
@@ -174,7 +174,7 @@
del_timer_sync(&dev->catas_err.timer);
if (dev->catas_err.map)
- iounmap(dev->catas_err.map);
+ iounmap(dev->catas_err.map, dev->catas_err.size * 4);
spin_lock_irq(&catas_lock);
list_del(&dev->catas_err.list);
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_cmd.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -490,7 +490,7 @@
MTHCA_MAILBOX_SIZE,
MTHCA_MAILBOX_SIZE, 0);
if (!dev->cmd.pool) {
- iounmap(dev->hcr);
+ iounmap(dev->hcr, MTHCA_HCR_SIZE);
return -ENOMEM;
}
@@ -500,9 +500,9 @@
void mthca_cmd_cleanup(struct mthca_dev *dev)
{
pci_pool_destroy(dev->cmd.pool);
- iounmap(dev->hcr);
+ iounmap(dev->hcr, MTHCA_HCR_SIZE);
if (dev->cmd.flags & MTHCA_CMD_POST_DOORBELLS)
- iounmap(dev->cmd.dbell_map);
+ iounmap(dev->cmd.dbell_map, dev->cmd.dbell_size);
}
/*
@@ -721,6 +721,7 @@
addr = pci_resource_start(dev->pdev, 2) +
((pci_resource_len(dev->pdev, 2) - 1) & base);
dev->cmd.dbell_map = ioremap(addr, max_off + sizeof(u32));
+ dev->cmd.dbell_size = max_off + sizeof(u32);
if (!dev->cmd.dbell_map)
return;
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_dev.h
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_dev.h
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_dev.h
@@ -128,6 +128,7 @@
struct mthca_cmd_context *context;
u16 token_mask;
u32 flags;
+ u32 dbell_size;
void __iomem *dbell_map;
u16 dbell_offsets[MTHCA_CMD_NUM_DBELL_DWORDS];
};
@@ -217,6 +218,8 @@
struct mthca_icm_table *mtt_table;
struct mthca_icm_table *mpt_table;
struct {
+ unsigned long mpt_size;
+ unsigned long mtt_size;
void __iomem *mpt_base;
void __iomem *mtt_base;
struct mthca_buddy mtt_buddy;
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_eq.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_eq.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_eq.c
@@ -687,7 +687,7 @@
dev->fw.arbel.eq_arm_base) + 4, 4,
&dev->eq_regs.arbel.eq_arm)) {
mthca_err(dev, "Couldn't map EQ arm register, aborting.\n");
- iounmap(dev->clr_base);
+ iounmap(dev->clr_base, MTHCA_CLR_INT_SIZE);
return -ENOMEM;
}
@@ -696,8 +696,8 @@
MTHCA_EQ_SET_CI_SIZE,
&dev->eq_regs.arbel.eq_set_ci_base)) {
mthca_err(dev, "Couldn't map EQ CI register, aborting.\n");
- iounmap(dev->eq_regs.arbel.eq_arm);
- iounmap(dev->clr_base);
+ iounmap(dev->eq_regs.arbel.eq_arm, 4);
+ iounmap(dev->clr_base, MTHCA_CLR_INT_SIZE);
return -ENOMEM;
}
} else {
@@ -713,7 +713,7 @@
&dev->eq_regs.tavor.ecr_base)) {
mthca_err(dev, "Couldn't map ecr register, "
"aborting.\n");
- iounmap(dev->clr_base);
+ iounmap(dev->clr_base, MTHCA_CLR_INT_SIZE);
return -ENOMEM;
}
}
@@ -725,12 +725,12 @@
static void mthca_unmap_eq_regs(struct mthca_dev *dev)
{
if (mthca_is_memfree(dev)) {
- iounmap(dev->eq_regs.arbel.eq_set_ci_base);
- iounmap(dev->eq_regs.arbel.eq_arm);
- iounmap(dev->clr_base);
+ iounmap(dev->eq_regs.arbel.eq_set_ci_base, MTHCA_EQ_SET_CI_SIZE);
+ iounmap(dev->eq_regs.arbel.eq_arm, 4);
+ iounmap(dev->clr_base, MTHCA_CLR_INT_SIZE);
} else {
- iounmap(dev->eq_regs.tavor.ecr_base);
- iounmap(dev->clr_base);
+ iounmap(dev->eq_regs.tavor.ecr_base, MTHCA_ECR_SIZE + MTHCA_ECR_CLR_SIZE);
+ iounmap(dev->clr_base, MTHCA_CLR_INT_SIZE);
}
}
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_main.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_main.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_main.c
@@ -917,7 +917,7 @@
mthca_cleanup_pd_table(dev);
err_kar_unmap:
- iounmap(dev->kar);
+ iounmap(dev->kar, PAGE_SIZE);
err_uar_free:
mthca_uar_free(dev, &dev->driver_uar);
@@ -1186,7 +1186,7 @@
mthca_cleanup_mr_table(mdev);
mthca_cleanup_pd_table(mdev);
- iounmap(mdev->kar);
+ iounmap(mdev->kar, PAGE_SIZE);
mthca_uar_free(mdev, &mdev->driver_uar);
mthca_cleanup_uar_table(mdev);
mthca_close_hca(mdev);
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_mr.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_mr.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -894,8 +894,9 @@
((pci_resource_len(dev->pdev, 4) - 1) &
dev->mr_table.mpt_base);
+ dev->mr_table.tavor_fmr.mpt_size = mpts * sizeof(struct mthca_mpt_entry);
dev->mr_table.tavor_fmr.mpt_base =
- ioremap(addr, mpts * sizeof(struct mthca_mpt_entry));
+ ioremap(addr, dev->mr_table.tavor_fmr.mpt_size);
if (!dev->mr_table.tavor_fmr.mpt_base) {
mthca_warn(dev, "MPT ioremap for FMR failed.\n");
@@ -907,8 +908,9 @@
((pci_resource_len(dev->pdev, 4) - 1) &
dev->mr_table.mtt_base);
+ dev->mr_table.tavor_fmr.mtt_size = mtts * dev->limits.mtt_seg_size;
dev->mr_table.tavor_fmr.mtt_base =
- ioremap(addr, mtts * dev->limits.mtt_seg_size);
+ ioremap(addr, dev->mr_table.tavor_fmr.mtt_size);
if (!dev->mr_table.tavor_fmr.mtt_base) {
mthca_warn(dev, "MTT ioremap for FMR failed.\n");
err = -ENOMEM;
@@ -953,11 +955,13 @@
err_fmr_mtt_buddy:
if (dev->mr_table.tavor_fmr.mtt_base)
- iounmap(dev->mr_table.tavor_fmr.mtt_base);
+ iounmap(dev->mr_table.tavor_fmr.mtt_base,
+ dev->mr_table.tavor_fmr.mtt_size);
err_fmr_mtt:
if (dev->mr_table.tavor_fmr.mpt_base)
- iounmap(dev->mr_table.tavor_fmr.mpt_base);
+ iounmap(dev->mr_table.tavor_fmr.mpt_base,
+ dev->mr_table.tavor_fmr.mpt_size);
err_fmr_mpt:
mthca_buddy_cleanup(&dev->mr_table.mtt_buddy);
@@ -977,9 +981,11 @@
mthca_buddy_cleanup(&dev->mr_table.mtt_buddy);
if (dev->mr_table.tavor_fmr.mtt_base)
- iounmap(dev->mr_table.tavor_fmr.mtt_base);
+ iounmap(dev->mr_table.tavor_fmr.mtt_base,
+ dev->mr_table.tavor_fmr.mtt_size);
if (dev->mr_table.tavor_fmr.mpt_base)
- iounmap(dev->mr_table.tavor_fmr.mpt_base);
+ iounmap(dev->mr_table.tavor_fmr.mpt_base,
+ dev->mr_table.tavor_fmr.mpt_size);
mthca_alloc_cleanup(&dev->mr_table.mpt_alloc);
}
Index: sys/ofed/drivers/infiniband/hw/mthca/mthca_reset.c
===================================================================
--- sys/ofed/drivers/infiniband/hw/mthca/mthca_reset.c
+++ sys/ofed/drivers/infiniband/hw/mthca/mthca_reset.c
@@ -163,7 +163,7 @@
}
writel(MTHCA_RESET_VALUE, reset);
- iounmap(reset);
+ iounmap(reset, 4);
}
/* Docs say to wait one second before accessing device */
Index: sys/ofed/drivers/net/mlx4/alloc.c
===================================================================
--- sys/ofed/drivers/net/mlx4/alloc.c
+++ sys/ofed/drivers/net/mlx4/alloc.c
@@ -285,7 +285,7 @@
buf->direct.map);
else {
if (BITS_PER_LONG == 64 && buf->direct.buf)
- vunmap(buf->direct.buf);
+ vunmap(buf->direct.buf, buf->nbufs);
for (i = 0; i < buf->nbufs; ++i)
if (buf->page_list[i].buf)
Index: sys/ofed/drivers/net/mlx4/catas.c
===================================================================
--- sys/ofed/drivers/net/mlx4/catas.c
+++ sys/ofed/drivers/net/mlx4/catas.c
@@ -158,7 +158,7 @@
del_timer_sync(&priv->catas_err.timer);
if (priv->catas_err.map) {
- iounmap(priv->catas_err.map);
+ iounmap(priv->catas_err.map, priv->fw.catas_size * 4);
priv->catas_err.map = NULL;
}
Index: sys/ofed/drivers/net/mlx4/cmd.c
===================================================================
--- sys/ofed/drivers/net/mlx4/cmd.c
+++ sys/ofed/drivers/net/mlx4/cmd.c
@@ -2239,7 +2239,7 @@
err_comm_admin:
kfree(priv->mfunc.master.slave_state);
err_comm:
- iounmap(priv->mfunc.comm);
+ iounmap(priv->mfunc.comm, MLX4_COMM_PAGESIZE);
err_vhcr:
dma_free_coherent(&(dev->pdev->dev), PAGE_SIZE,
priv->mfunc.vhcr,
@@ -2296,7 +2296,7 @@
err_hcr:
if (!mlx4_is_slave(dev))
- iounmap(priv->cmd.hcr);
+ iounmap(priv->cmd.hcr, MLX4_HCR_SIZE);
return -ENOMEM;
}
@@ -2317,7 +2317,7 @@
kfree(priv->mfunc.master.vf_oper);
}
- iounmap(priv->mfunc.comm);
+ iounmap(priv->mfunc.comm, MLX4_COMM_PAGESIZE);
}
void mlx4_cmd_cleanup(struct mlx4_dev *dev)
@@ -2327,7 +2327,7 @@
pci_pool_destroy(priv->cmd.pool);
if (!mlx4_is_slave(dev))
- iounmap(priv->cmd.hcr);
+ iounmap(priv->cmd.hcr, MLX4_HCR_SIZE);
if (mlx4_is_mfunc(dev))
dma_free_coherent(&(dev->pdev->dev), PAGE_SIZE,
priv->mfunc.vhcr, priv->mfunc.vhcr_dma);
Index: sys/ofed/drivers/net/mlx4/en_main.c
===================================================================
--- sys/ofed/drivers/net/mlx4/en_main.c
+++ sys/ofed/drivers/net/mlx4/en_main.c
@@ -164,7 +164,7 @@
ret = mlx4_mr_free(dev, &mdev->mr);
if (ret)
mlx4_err(mdev, "Error deregistering MR. The system may have become unstable.");
- iounmap(mdev->uar_map);
+ iounmap(mdev->uar_map, PAGE_SIZE);
mlx4_uar_free(dev, &mdev->priv_uar);
mlx4_pd_free(dev, mdev->priv_pdn);
kfree(mdev);
@@ -277,7 +277,7 @@
mlx4_err(mdev, "Error deregistering MR. The system may have become unstable.");
err_map:
if (mdev->uar_map)
- iounmap(mdev->uar_map);
+ iounmap(mdev->uar_map, PAGE_SIZE);
err_uar:
mlx4_uar_free(dev, &mdev->priv_uar);
err_pd:
Index: sys/ofed/drivers/net/mlx4/en_netdev.c
===================================================================
--- sys/ofed/drivers/net/mlx4/en_netdev.c
+++ sys/ofed/drivers/net/mlx4/en_netdev.c
@@ -264,11 +264,10 @@
mlx4_en_filter_find(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip,
u8 ip_proto, __be16 src_port, __be16 dst_port)
{
- struct hlist_node *elem;
struct mlx4_en_filter *filter;
struct mlx4_en_filter *ret = NULL;
- hlist_for_each_entry(filter, elem,
+ hlist_for_each_entry(filter,
filter_hash_bucket(priv, src_ip, dst_ip,
src_port, dst_port),
filter_chain) {
Index: sys/ofed/drivers/net/mlx4/en_resources.c
===================================================================
--- sys/ofed/drivers/net/mlx4/en_resources.c
+++ sys/ofed/drivers/net/mlx4/en_resources.c
@@ -111,7 +111,7 @@
if (BITS_PER_LONG == 64 || buf->nbufs == 1)
return;
- vunmap(buf->direct.buf);
+ vunmap(buf->direct.buf, buf->nbufs);
}
void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event)
Index: sys/ofed/drivers/net/mlx4/eq.c
===================================================================
--- sys/ofed/drivers/net/mlx4/eq.c
+++ sys/ofed/drivers/net/mlx4/eq.c
@@ -895,7 +895,7 @@
for (i = 0; i < mlx4_num_eq_uar(dev); ++i)
if (priv->eq_table.uar_map[i]) {
- iounmap(priv->eq_table.uar_map[i]);
+ iounmap(priv->eq_table.uar_map[i], PAGE_SIZE);
priv->eq_table.uar_map[i] = NULL;
}
}
@@ -1102,7 +1102,7 @@
{
struct mlx4_priv *priv = mlx4_priv(dev);
- iounmap(priv->clr_base);
+ iounmap(priv->clr_base, MLX4_CLR_INT_SIZE);
}
int mlx4_alloc_eq_table(struct mlx4_dev *dev)
Index: sys/ofed/drivers/net/mlx4/main.c
===================================================================
--- sys/ofed/drivers/net/mlx4/main.c
+++ sys/ofed/drivers/net/mlx4/main.c
@@ -1786,7 +1786,7 @@
struct mlx4_priv *priv = mlx4_priv(dev);
if (priv->clock_mapping)
- iounmap(priv->clock_mapping);
+ iounmap(priv->clock_mapping, MLX4_CLOCK_SIZE);
}
static void mlx4_close_hca(struct mlx4_dev *dev)
@@ -2854,7 +2854,7 @@
mlx4_cleanup_pd_table(dev);
err_kar_unmap:
- iounmap(priv->kar);
+ iounmap(priv->kar, PAGE_SIZE);
err_uar_free:
mlx4_uar_free(dev, &priv->driver_uar);
@@ -3074,7 +3074,7 @@
}
ret = readl(owner);
- iounmap(owner);
+ iounmap(owner, MLX4_OWNER_SIZE);
return (int) !!ret;
}
@@ -3093,7 +3093,7 @@
}
writel(0, owner);
msleep(1000);
- iounmap(owner);
+ iounmap(owner, MLX4_OWNER_SIZE);
}
static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data)
@@ -3484,7 +3484,7 @@
mlx4_free_resource_tracker(dev,
RES_TR_FREE_STRUCTS_ONLY);
- iounmap(priv->kar);
+ iounmap(priv->kar, PAGE_SIZE);
mlx4_uar_free(dev, &priv->driver_uar);
mlx4_cleanup_uar_table(dev);
if (!mlx4_is_slave(dev))
Index: sys/ofed/drivers/net/mlx4/pd.c
===================================================================
--- sys/ofed/drivers/net/mlx4/pd.c
+++ sys/ofed/drivers/net/mlx4/pd.c
@@ -227,7 +227,7 @@
unamp_uar:
bf->uar = NULL;
- iounmap(uar->map);
+ iounmap(uar->map, PAGE_SIZE);
free_uar:
mlx4_uar_free(dev, uar);
@@ -257,7 +257,7 @@
list_del(&bf->uar->bf_list);
io_mapping_unmap(bf->uar->bf_map);
- iounmap(bf->uar->map);
+ iounmap(bf->uar->map, PAGE_SIZE);
mlx4_uar_free(dev, bf->uar);
kfree(bf->uar);
} else if (list_empty(&bf->uar->bf_list))
Index: sys/ofed/drivers/net/mlx4/reset.c
===================================================================
--- sys/ofed/drivers/net/mlx4/reset.c
+++ sys/ofed/drivers/net/mlx4/reset.c
@@ -111,13 +111,13 @@
if (sem) {
mlx4_err(dev, "Failed to obtain HW semaphore, aborting\n");
err = -EAGAIN;
- iounmap(reset);
+ iounmap(reset, MLX4_RESET_SIZE);
goto out;
}
/* actually hit reset */
writel(MLX4_RESET_VALUE, reset + MLX4_RESET_OFFSET);
- iounmap(reset);
+ iounmap(reset, MLX4_RESET_SIZE);
/* wait half a second before accessing device */
msleep(500);
Index: sys/ofed/include/linux/bitops.h
===================================================================
--- sys/ofed/include/linux/bitops.h
+++ sys/ofed/include/linux/bitops.h
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -29,16 +29,21 @@
#ifndef _LINUX_BITOPS_H_
#define _LINUX_BITOPS_H_
+#include <sys/types.h>
+#include <sys/systm.h>
+
+#define BIT(nr) (1UL << (nr))
#ifdef __LP64__
#define BITS_PER_LONG 64
#else
#define BITS_PER_LONG 32
#endif
-#define BIT_MASK(n) (~0UL >> (BITS_PER_LONG - (n)))
+#define BIT_MASK(nr) (1UL << ((nr) & (BITS_PER_LONG - 1)))
#define BITS_TO_LONGS(n) howmany((n), BITS_PER_LONG)
-#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
+#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
+#define GENMASK(lo, hi) (((2UL << ((hi) - (lo))) - 1UL) << (lo))
-#define BITS_PER_BYTE 8
+#define BITS_PER_BYTE 8
static inline int
__ffs(int mask)
@@ -78,50 +83,6 @@
}
static inline unsigned long
-find_first_bit(unsigned long *addr, unsigned long size)
-{
- long mask;
- int bit;
-
- for (bit = 0; size >= BITS_PER_LONG;
- size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
- if (*addr == 0)
- continue;
- return (bit + __ffsl(*addr));
- }
- if (size) {
- mask = (*addr) & BIT_MASK(size);
- if (mask)
- bit += __ffsl(mask);
- else
- bit += size;
- }
- return (bit);
-}
-
-static inline unsigned long
-find_first_zero_bit(unsigned long *addr, unsigned long size)
-{
- long mask;
- int bit;
-
- for (bit = 0; size >= BITS_PER_LONG;
- size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
- if (~(*addr) == 0)
- continue;
- return (bit + __ffsl(~(*addr)));
- }
- if (size) {
- mask = ~(*addr) & BIT_MASK(size);
- if (mask)
- bit += __ffsl(mask);
- else
- bit += size;
- }
- return (bit);
-}
-
-static inline unsigned long
find_last_bit(unsigned long *addr, unsigned long size)
{
long mask;
@@ -134,7 +95,7 @@
bit = BITS_PER_LONG * pos;
addr += pos;
if (offs) {
- mask = (*addr) & BIT_MASK(offs);
+ mask = (*addr) & (BIT_MASK(offs) - 1UL);
if (mask)
return (bit + __flsl(mask));
}
@@ -148,82 +109,55 @@
}
static inline unsigned long
-find_next_bit(unsigned long *addr, unsigned long size, unsigned long offset)
+find_next_bit(const unsigned long *addr, unsigned long size,
+ unsigned long offset)
{
- long mask;
- int offs;
- int bit;
- int pos;
+ const unsigned long mm = BITS_PER_LONG - 1;
+ unsigned long mask = BIT_MASK(offset) - 1UL;
- if (offset >= size)
- return (size);
- pos = offset / BITS_PER_LONG;
- offs = offset % BITS_PER_LONG;
- bit = BITS_PER_LONG * pos;
- addr += pos;
- if (offs) {
- mask = (*addr) & ~BIT_MASK(offs);
- if (mask)
- return (bit + __ffsl(mask));
- if (size - bit <= BITS_PER_LONG)
- return (size);
- bit += BITS_PER_LONG;
- addr++;
- }
- for (size -= bit; size >= BITS_PER_LONG;
- size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
- if (*addr == 0)
- continue;
- return (bit + __ffsl(*addr));
- }
- if (size) {
- mask = (*addr) & BIT_MASK(size);
- if (mask)
- bit += __ffsl(mask);
- else
- bit += size;
- }
- return (bit);
+ while (offset < size) {
+ mask = addr[BIT_WORD(offset)] & ~mask;
+ if (mask != 0) {
+ offset = __ffsl(mask) | (offset & ~mm);
+ break;
+ }
+ offset += ((~offset) & mm) + 1;
+ }
+ if (offset > size)
+ offset = size;
+ return (offset);
}
static inline unsigned long
-find_next_zero_bit(unsigned long *addr, unsigned long size,
+find_next_zero_bit(const unsigned long *addr, unsigned long size,
unsigned long offset)
{
- long mask;
- int offs;
- int bit;
- int pos;
+ const unsigned long mm = BITS_PER_LONG - 1;
+ unsigned long mask = BIT_MASK(offset) - 1UL;
- if (offset >= size)
- return (size);
- pos = offset / BITS_PER_LONG;
- offs = offset % BITS_PER_LONG;
- bit = BITS_PER_LONG * pos;
- addr += pos;
- if (offs) {
- mask = ~(*addr) & ~BIT_MASK(offs);
- if (mask)
- return (bit + __ffsl(mask));
- if (size - bit <= BITS_PER_LONG)
- return (size);
- bit += BITS_PER_LONG;
- addr++;
- }
- for (size -= bit; size >= BITS_PER_LONG;
- size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
- if (~(*addr) == 0)
- continue;
- return (bit + __ffsl(~(*addr)));
- }
- if (size) {
- mask = ~(*addr) & BIT_MASK(size);
- if (mask)
- bit += __ffsl(mask);
- else
- bit += size;
- }
- return (bit);
+ while (offset < size) {
+ mask = (~addr[BIT_WORD(offset)]) & ~mask;
+ if (mask != 0) {
+ offset = __ffsl(mask) | (offset & ~mm);
+ break;
+ }
+ offset += ((~offset) & mm) + 1;
+ }
+ if (offset > size)
+ offset = size;
+ return (offset);
+}
+
+static inline unsigned long
+find_first_bit(unsigned long *addr, unsigned long size)
+{
+ return (find_next_bit(addr, size, 0));
+}
+
+static inline unsigned long
+find_first_zero_bit(unsigned long *addr, unsigned long size)
+{
+ return (find_next_zero_bit(addr, size, 0));
}
static inline void
@@ -245,13 +179,13 @@
memset(addr, 0xff, len);
tail = size & (BITS_PER_LONG - 1);
if (tail)
- addr[size / BITS_PER_LONG] = BIT_MASK(tail);
+ addr[size / BITS_PER_LONG] = BIT_MASK(tail) - 1UL;
}
static inline int
bitmap_full(unsigned long *addr, int size)
{
- long mask;
+ unsigned long mask;
int tail;
int len;
int i;
@@ -262,7 +196,7 @@
return (0);
tail = size & (BITS_PER_LONG - 1);
if (tail) {
- mask = BIT_MASK(tail);
+ mask = BIT_MASK(tail) - 1UL;
if ((addr[i] & mask) != mask)
return (0);
}
@@ -283,38 +217,36 @@
return (0);
tail = size & (BITS_PER_LONG - 1);
if (tail) {
- mask = BIT_MASK(tail);
+ mask = BIT_MASK(tail) - 1UL;
if ((addr[i] & mask) != 0)
return (0);
}
return (1);
}
-#define NBLONG (NBBY * sizeof(long))
-
#define __set_bit(i, a) \
- atomic_set_long(&((volatile long *)(a))[(i)/NBLONG], 1UL << ((i) % NBLONG))
+ atomic_set_long(&((volatile long *)(a))[BIT_WORD(i)], BIT_MASK(i))
#define set_bit(i, a) \
- atomic_set_long(&((volatile long *)(a))[(i)/NBLONG], 1UL << ((i) % NBLONG))
+ atomic_set_long(&((volatile long *)(a))[BIT_WORD(i)], BIT_MASK(i))
#define __clear_bit(i, a) \
- atomic_clear_long(&((volatile long *)(a))[(i)/NBLONG], 1UL << ((i) % NBLONG))
+ atomic_clear_long(&((volatile long *)(a))[BIT_WORD(i)], BIT_MASK(i))
#define clear_bit(i, a) \
- atomic_clear_long(&((volatile long *)(a))[(i)/NBLONG], 1UL << ((i) % NBLONG))
+ atomic_clear_long(&((volatile long *)(a))[BIT_WORD(i)], BIT_MASK(i))
#define test_bit(i, a) \
- !!(atomic_load_acq_long(&((volatile long *)(a))[(i)/NBLONG]) & \
- (1UL << ((i) % NBLONG)))
+ ((atomic_load_acq_long(&((volatile long *)(a))[BIT_WORD(i)]) & \
+ (BIT_MASK(i))) != 0)
static inline long
test_and_clear_bit(long bit, long *var)
{
long val;
- var += bit / (sizeof(long) * NBBY);
- bit %= sizeof(long) * NBBY;
+ var += BIT_WORD(bit);
+ bit %= BITS_PER_LONG;
bit = (1UL << bit);
do {
val = *(volatile long *)var;
@@ -328,8 +260,8 @@
{
long val;
- var += bit / (sizeof(long) * NBBY);
- bit %= sizeof(long) * NBBY;
+ var += BIT_WORD(bit);
+ bit %= BITS_PER_LONG;
bit = (1UL << bit);
do {
val = *(volatile long *)var;
@@ -338,14 +270,9 @@
return !!(val & bit);
}
-
-#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
-#define BITMAP_LAST_WORD_MASK(nbits) \
-( \
- ((nbits) % BITS_PER_LONG) ? \
- (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \
-)
-
+#define BITMAP_FIRST_WORD_MASK(start) (-BIT_MASK(start))
+#define BITMAP_LAST_WORD_MASK(nbits) \
+ (((nbits) & (BITS_PER_LONG - 1)) ? (BIT_MASK(nbits) - 1UL) : -1UL)
static inline void
bitmap_set(unsigned long *map, int start, int nr)
@@ -390,36 +317,28 @@
}
enum {
- REG_OP_ISFREE, /* true if region is all zero bits */
- REG_OP_ALLOC, /* set all bits in region */
- REG_OP_RELEASE, /* clear all bits in region */
+ REG_OP_ISFREE,
+ REG_OP_ALLOC,
+ REG_OP_RELEASE,
};
-static int __reg_op(unsigned long *bitmap, int pos, int order, int reg_op)
+static inline int __reg_op(unsigned long *bitmap, int pos, int order, int reg_op)
{
- int nbits_reg; /* number of bits in region */
- int index; /* index first long of region in bitmap */
- int offset; /* bit offset region in bitmap[index] */
- int nlongs_reg; /* num longs spanned by region in bitmap */
- int nbitsinlong; /* num bits of region in each spanned long */
- unsigned long mask; /* bitmask for one long of region */
- int i; /* scans bitmap by longs */
- int ret = 0; /* return value */
-
- /*
- * Either nlongs_reg == 1 (for small orders that fit in one long)
- * or (offset == 0 && mask == ~0UL) (for larger multiword orders.)
- */
+ int nbits_reg;
+ int index;
+ int offset;
+ int nlongs_reg;
+ int nbitsinlong;
+ unsigned long mask;
+ int i;
+ int ret = 0;
+
nbits_reg = 1 << order;
index = pos / BITS_PER_LONG;
offset = pos - (index * BITS_PER_LONG);
nlongs_reg = BITS_TO_LONGS(nbits_reg);
nbitsinlong = min(nbits_reg, BITS_PER_LONG);
- /*
- * Can't do "mask = (1UL << nbitsinlong) - 1", as that
- * overflows if nbitsinlong == BITS_PER_LONG.
- */
mask = (1UL << (nbitsinlong - 1));
mask += mask - 1;
mask <<= offset;
@@ -430,7 +349,7 @@
if (bitmap[index + i] & mask)
goto done;
}
- ret = 1; /* all bits in region free (zero) */
+ ret = 1;
break;
case REG_OP_ALLOC:
@@ -447,24 +366,11 @@
return ret;
}
-/**
- * bitmap_find_free_region - find a contiguous aligned mem region
- * @bitmap: array of unsigned longs corresponding to the bitmap
- * @bits: number of bits in the bitmap
- * @order: region size (log base 2 of number of bits) to find
- *
- * Find a region of free (zero) bits in a @bitmap of @bits bits and
- * allocate them (set them to one). Only consider regions of length
- * a power (@order) of two, aligned to that power of two, which
- * makes the search algorithm much faster.
- *
- * Return the bit offset in bitmap of the allocated region,
- * or -errno on failure.
- */
static inline int
bitmap_find_free_region(unsigned long *bitmap, int bits, int order)
{
- int pos, end; /* scans bitmap by regions of size order */
+ int pos;
+ int end;
for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) {
if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
@@ -475,18 +381,6 @@
return -ENOMEM;
}
-/**
- * bitmap_allocate_region - allocate bitmap region
- * @bitmap: array of unsigned longs corresponding to the bitmap
- * @pos: beginning of bit region to allocate
- * @order: region size (log base 2 of number of bits) to allocate
- *
- * Allocate (set bits in) a specified region of a bitmap.
- *
- * Return 0 on success, or %-EBUSY if specified region wasn't
- * free (not all bits were zero).
- */
-
static inline int
bitmap_allocate_region(unsigned long *bitmap, int pos, int order)
{
@@ -496,25 +390,13 @@
return 0;
}
-/**
- * bitmap_release_region - release allocated bitmap region
- * @bitmap: array of unsigned longs corresponding to the bitmap
- * @pos: beginning of bit region to release
- * @order: region size (log base 2 of number of bits) to release
- *
- * This is the complement to __bitmap_find_free_region() and releases
- * the found region (by clearing it in the bitmap).
- *
- * No return value.
- */
static inline void
bitmap_release_region(unsigned long *bitmap, int pos, int order)
{
__reg_op(bitmap, pos, order, REG_OP_RELEASE);
}
-
-#define for_each_set_bit(bit, addr, size) \
+#define for_each_set_bit(bit, addr, size) \
for ((bit) = find_first_bit((addr), (size)); \
(bit) < (size); \
(bit) = find_next_bit((addr), (size), (bit) + 1))
Index: sys/ofed/include/linux/compiler.h
===================================================================
--- sys/ofed/include/linux/compiler.h
+++ sys/ofed/include/linux/compiler.h
@@ -2,7 +2,8 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2015 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -62,5 +63,12 @@
#define typeof(x) __typeof(x)
#define uninitialized_var(x) x = x
+#define __read_mostly __attribute__((__section__(".data.read_mostly")))
+#define __always_unused __unused
+#define __must_check __result_use_check
+
+#define __printf(a,b) __printflike(a,b)
+
+#define barrier() __asm__ __volatile__("": : :"memory")
#endif /* _LINUX_COMPILER_H_ */
Index: sys/ofed/include/linux/delay.h
===================================================================
--- sys/ofed/include/linux/delay.h
+++ sys/ofed/include/linux/delay.h
@@ -2,7 +2,8 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2014 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,6 +32,7 @@
#define _LINUX_DELAY_H_
#include <linux/jiffies.h>
+#include <sys/systm.h>
static inline void
linux_msleep(int ms)
@@ -41,4 +43,26 @@
#undef msleep
#define msleep linux_msleep
+#define udelay(t) DELAY(t)
+
+static inline void
+mdelay(unsigned long msecs)
+{
+ int loops = msecs;
+ while (loops--)
+ DELAY(1000);
+}
+
+static inline void
+ndelay(unsigned long x)
+{
+ DELAY(howmany(x, 1000));
+}
+
+static inline void
+usleep_range(unsigned long min, unsigned long max)
+{
+ DELAY(min);
+}
+
#endif /* _LINUX_DELAY_H_ */
Index: sys/ofed/include/linux/dma-mapping.h
===================================================================
--- sys/ofed/include/linux/dma-mapping.h
+++ sys/ofed/include/linux/dma-mapping.h
@@ -87,7 +87,7 @@
int is_phys;
};
-#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL << (n)) - 1))
+#define DMA_BIT_MASK(n) ((2ULL << ((n) - 1)) - 1ULL)
static inline int
dma_supported(struct device *dev, u64 mask)
Index: sys/ofed/include/linux/err.h
===================================================================
--- sys/ofed/include/linux/err.h
+++ sys/ofed/include/linux/err.h
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -52,6 +52,12 @@
return IS_ERR_VALUE((unsigned long)ptr);
}
+static inline long
+IS_ERR_OR_NULL(const void *ptr)
+{
+ return !ptr || IS_ERR_VALUE((unsigned long)ptr);
+}
+
static inline void *
ERR_CAST(void *ptr)
{
Index: sys/ofed/include/linux/errno.h
===================================================================
--- sys/ofed/include/linux/errno.h
+++ sys/ofed/include/linux/errno.h
@@ -32,6 +32,8 @@
#include <sys/errno.h>
+#define ECHRNG EDOM
+#define ETIME ETIMEDOUT
#define ECOMM ESTALE
#define ENODATA ECONNREFUSED
#define ENOIOCTLCMD ENOIOCTL
Index: sys/ofed/include/linux/io-mapping.h
===================================================================
--- sys/ofed/include/linux/io-mapping.h
+++ sys/ofed/include/linux/io-mapping.h
@@ -2,7 +2,8 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2015 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,46 +34,64 @@
#include <linux/types.h>
#include <linux/io.h>
-struct io_mapping;
+#include <machine/pmap.h>
+
+struct io_mapping {
+ resource_size_t base;
+ unsigned long size;
+ unsigned long prot;
+ caddr_t vaddr;
+};
static inline struct io_mapping *
io_mapping_create_wc(resource_size_t base, unsigned long size)
{
+ struct io_mapping *map;
- return ioremap_wc(base, size);
+ map = malloc(sizeof(struct io_mapping), M_KMALLOC, M_WAITOK);
+ map->base = base;
+ map->size = size;
+ map->prot = VM_MEMATTR_WRITE_COMBINING;
+
+ map->vaddr = pmap_mapdev_attr(base, size,
+ VM_MEMATTR_WRITE_COMBINING);
+ if (map->vaddr == NULL) {
+ free(map, M_KMALLOC);
+ return (NULL);
+ }
+ return (map);
}
static inline void
io_mapping_free(struct io_mapping *mapping)
{
-
- iounmap(mapping);
+ /* Default memory attribute is write-back */
+ pmap_mapdev_attr(mapping->base, mapping->size, VM_MEMATTR_WRITE_BACK);
+ free(mapping, M_KMALLOC);
}
static inline void *
io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset)
{
-
- return (((char *)mapping) + offset);
-}
-
-static inline void
-io_mapping_unmap_atomic(void *vaddr)
-{
-
+ return ((void *)(mapping->vaddr + offset));
}
static inline void *
io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset)
{
+ return (io_mapping_map_atomic_wc(mapping, offset));
+}
- return (((char *) mapping) + offset);
+static inline void
+io_mapping_unmap_atomic(void *vaddr)
+{
+ /* NOP */
}
static inline void
io_mapping_unmap(void *vaddr)
{
-
+ /* NOP */
}
#endif /* _LINUX_IO_MAPPING_H_ */
Index: sys/ofed/include/linux/io.h
===================================================================
--- sys/ofed/include/linux/io.h
+++ sys/ofed/include/linux/io.h
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -60,7 +60,7 @@
/*
* XXX This is all x86 specific. It should be bus space access.
*/
-#define mmiowb()
+#define mmiowb() do { } while (0)
#undef writel
static inline void
@@ -104,13 +104,10 @@
*(volatile uint32_t *)addr = htobe32(v);
}
-void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr);
-#define ioremap_nocache(addr, size) \
- _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
-#define ioremap_wc(addr, size) \
- _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING)
-#define ioremap ioremap_nocache
-void iounmap(void *addr);
+void *ioremap(resource_size_t offset, unsigned long size);
+void *ioremap_nocache(resource_size_t offset, unsigned long size);
+void *ioremap_wc(resource_size_t offset, unsigned long size);
+void iounmap(void *addr, unsigned long size);
#define memset_io(a, b, c) memset((a), (b), (c))
#define memcpy_fromio(a, b, c) memcpy((a), (b), (c))
Index: sys/ofed/include/linux/jiffies.h
===================================================================
--- sys/ofed/include/linux/jiffies.h
+++ sys/ofed/include/linux/jiffies.h
@@ -31,9 +31,11 @@
#include <linux/types.h>
#include <linux/kernel.h>
+#include <linux/time.h>
#include <sys/time.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
static inline int
msecs_to_jiffies(int msec)
@@ -46,13 +48,49 @@
}
#define jiffies ticks
+#define jiffies_64 ticks
#define jiffies_to_msecs(x) (((int64_t)(x)) * 1000 / hz)
+#define MAX_JIFFY_OFFSET ((INT_MAX >> 1) - 1)
+
#define time_after(a, b) ((int)((b) - (a)) < 0)
#define time_before(a, b) time_after(b,a)
#define time_after_eq(a, b) ((int)((a) - (b)) >= 0)
#define time_before_eq(a, b) time_after_eq(b, a)
+#define time_in_range(a,b,c) \
+ (time_after_eq(a,b) && time_before_eq(a,c))
#define HZ hz
+static inline int
+timespec_to_jiffies(const struct timespec *ts)
+{
+ u64 result;
+
+ result = ((u64)hz * ts->tv_sec) +
+ (((u64)hz * ts->tv_nsec + NSEC_PER_SEC - 1) / NSEC_PER_SEC);
+ if (result > MAX_JIFFY_OFFSET)
+ result = MAX_JIFFY_OFFSET;
+
+ return ((int)result);
+}
+
+static inline int
+usecs_to_jiffies(const unsigned int u)
+{
+ u64 result;
+
+ result = ((u64)u * hz + 1000000 - 1) / 1000000;
+ if (result > MAX_JIFFY_OFFSET)
+ result = MAX_JIFFY_OFFSET;
+
+ return ((int)result);
+}
+
+static inline u64
+get_jiffies_64(void)
+{
+ return ((u64)(unsigned)ticks);
+}
+
#endif /* _LINUX_JIFFIES_H_ */
Index: sys/ofed/include/linux/kernel.h
===================================================================
--- sys/ofed/include/linux/kernel.h
+++ sys/ofed/include/linux/kernel.h
@@ -2,7 +2,8 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2014-2015 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -70,6 +71,7 @@
#undef PTR_ALIGN
#define PTR_ALIGN(p, a) ((__typeof(p))ALIGN((uintptr_t)(p), (a)))
#define DIV_ROUND_UP howmany
+#define DIV_ROUND_UP_ULL(x, n) DIV_ROUND_UP((unsigned long long)(x), (n))
#define FIELD_SIZEOF(t, f) sizeof(((t *)0)->f)
#define printk(X...) printf(X)
@@ -90,9 +92,6 @@
({ if (0) log(LOG_DEBUG, pr_fmt(fmt), ##__VA_ARGS__); 0; })
#endif
-#define udelay(t) DELAY(t)
-#define usleep_range(min,max) DELAY(min)
-
#ifndef pr_fmt
#define pr_fmt(fmt) fmt
#endif
@@ -164,9 +163,16 @@
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))
+
+#define min3(a, b, c) min(a, min(b,c))
+#define max3(a, b, c) max(a, max(b,c))
+
#define min_t(type, _x, _y) ((type)(_x) < (type)(_y) ? (type)(_x) : (type)(_y))
#define max_t(type, _x, _y) ((type)(_x) > (type)(_y) ? (type)(_x) : (type)(_y))
+#define clamp_t(type, _x, min, max) min_t(type, max_t(type, _x, min), max)
+#define clamp(x, lo, hi) min( max(x,lo), hi)
+
/*
* This looks more complex than it should be. But we need to
* get the type for the ~ right in round_down (it needs to be
@@ -184,4 +190,28 @@
int event;
} pm_message_t;
+/* Swap values of a and b */
+#define swap(a, b) do { \
+ typeof(a) _swap_tmp = a; \
+ a = b; \
+ b = _swap_tmp; \
+} while (0)
+
+#define DIV_ROUND_CLOSEST(x, divisor) (((x) + ((divisor) / 2)) / (divisor))
+
+static inline uintmax_t
+mult_frac(uintmax_t x, uintmax_t multiplier, uintmax_t divisor)
+{
+ uintmax_t q = (x / divisor);
+ uintmax_t r = (x % divisor);
+
+ return ((q * multiplier) + ((r * multiplier) / divisor));
+}
+
+static inline int64_t
+abs64(int64_t x)
+{
+ return (x < 0 ? -x : x);
+}
+
#endif /* _LINUX_KERNEL_H_ */
Index: sys/ofed/include/linux/kref.h
===================================================================
--- sys/ofed/include/linux/kref.h
+++ sys/ofed/include/linux/kref.h
@@ -2,7 +2,8 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,33 +33,57 @@
#include <sys/types.h>
#include <sys/refcount.h>
+#include <asm/atomic.h>
+
struct kref {
- volatile u_int count;
+ atomic_t refcount;
};
static inline void
kref_init(struct kref *kref)
{
- refcount_init(&kref->count, 1);
+ refcount_init(&kref->refcount.counter, 1);
}
static inline void
kref_get(struct kref *kref)
{
- refcount_acquire(&kref->count);
+ refcount_acquire(&kref->refcount.counter);
}
static inline int
kref_put(struct kref *kref, void (*rel)(struct kref *kref))
{
- if (refcount_release(&kref->count)) {
+ if (refcount_release(&kref->refcount.counter)) {
rel(kref);
return 1;
}
return 0;
}
+static inline int
+kref_sub(struct kref *kref, unsigned int count,
+ void (*rel)(struct kref *kref))
+{
+ while (count--) {
+ if (refcount_release(&kref->refcount.counter)) {
+ rel(kref);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * kref_get_unless_zero: Increment refcount for object unless it is zero.
+ */
+static inline int __must_check
+kref_get_unless_zero(struct kref *kref)
+{
+ return atomic_add_unless(&kref->refcount, 1, 0);
+}
+
#endif /* _LINUX_KREF_H_ */
Index: sys/ofed/include/linux/ktime.h
===================================================================
--- sys/ofed/include/linux/ktime.h
+++ sys/ofed/include/linux/ktime.h
@@ -1,5 +1,6 @@
/*-
- * Copyright (c) 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2014-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2015 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,274 +28,107 @@
#ifndef _LINUX_KTIME_H
#define _LINUX_KTIME_H
-#include <sys/time.h>
#include <linux/types.h>
+#include <linux/time.h>
#include <linux/jiffies.h>
+#define ktime_get_ts(x) getnanouptime(x)
-/* Get the monotonic time in timespec format: */
-#define ktime_get_ts getnanouptime
-
-#define NSEC_PER_USEC 1000L
-#define NSEC_PER_SEC 1000000000L
-
-/*
- * ktime_t:
- *
- * On 64-bit CPUs a single 64-bit variable is used to store the hrtimers
- * internal representation of time values in scalar nanoseconds. The
- * design plays out best on 64-bit CPUs, where most conversions are
- * NOPs and most arithmetic ktime_t operations are plain arithmetic
- * operations.
- *
- * On 32-bit CPUs an optimized representation of the timespec structure
- * is used to avoid expensive conversions from and to timespecs. The
- * endian-aware order of the tv struct members is chosen to allow
- * mathematical operations on the tv64 member of the union too, which
- * for certain operations produces better code.
- *
- * For architectures with efficient support for 64/32-bit conversions the
- * plain scalar nanosecond based representation can be selected by the
- * config switch CONFIG_KTIME_SCALAR.
- */
+/* time values in nanoseconds */
union ktime {
- s64 tv64;
-#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
- struct {
-# ifdef __BIG_ENDIAN
- s32 sec, nsec;
-# else
- s32 nsec, sec;
-# endif
- } tv;
-#endif
+ int64_t tv64;
};
-typedef union ktime ktime_t; /* Kill this */
+typedef union ktime ktime_t;
#define KTIME_MAX ((s64)~((u64)1 << 63))
#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
-/*
- * ktime_t definitions when using the 64-bit scalar representation:
- */
-
-#if (BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR)
-
-/**
- * ktime_set - Set a ktime_t variable from a seconds/nanoseconds value
- * @secs: seconds to set
- * @nsecs: nanoseconds to set
- *
- * Return the ktime_t representation of the value
- */
-static inline ktime_t ktime_set(const long secs, const unsigned long nsecs)
-{
-#if (BITS_PER_LONG == 64)
- if (unlikely(secs >= KTIME_SEC_MAX))
- return (ktime_t){ .tv64 = KTIME_MAX };
-#endif
- return (ktime_t) { .tv64 = (s64)secs * NSEC_PER_SEC + (s64)nsecs };
-}
-
-/* Subtract two ktime_t variables. rem = lhs -rhs: */
-#define ktime_sub(lhs, rhs) \
- ({ (ktime_t){ .tv64 = (lhs).tv64 - (rhs).tv64 }; })
-
-/* Add two ktime_t variables. res = lhs + rhs: */
-#define ktime_add(lhs, rhs) \
- ({ (ktime_t){ .tv64 = (lhs).tv64 + (rhs).tv64 }; })
-
-/*
- * Add a ktime_t variable and a scalar nanosecond value.
- * res = kt + nsval:
- */
-#define ktime_add_ns(kt, nsval) \
- ({ (ktime_t){ .tv64 = (kt).tv64 + (nsval) }; })
-
-/*
- * Subtract a scalar nanosecod from a ktime_t variable
- * res = kt - nsval:
- */
-#define ktime_sub_ns(kt, nsval) \
- ({ (ktime_t){ .tv64 = (kt).tv64 - (nsval) }; })
-
-/* convert a timespec to ktime_t format: */
-static inline ktime_t timespec_to_ktime(struct timespec ts)
+static inline int64_t
+ktime_to_ns(ktime_t kt)
{
- return ktime_set(ts.tv_sec, ts.tv_nsec);
+ return kt.tv64;
}
-/* convert a timeval to ktime_t format: */
-static inline ktime_t timeval_to_ktime(struct timeval tv)
+static inline struct timeval
+ktime_to_timeval(ktime_t kt)
{
- return ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC);
+ return ns_to_timeval(kt.tv64);
}
-/* Map the ktime_t to timespec conversion to ns_to_timespec function */
-#define ktime_to_timespec(kt) ns_to_timespec((kt).tv64)
-
-/* Map the ktime_t to timeval conversion to ns_to_timeval function */
-#define ktime_to_timeval(kt) ns_to_timeval((kt).tv64)
-
-/* Convert ktime_t to nanoseconds - NOP in the scalar storage format: */
-#define ktime_to_ns(kt) ((kt).tv64)
-
-#else /* !((BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR)) */
-
-/*
- * Helper macros/inlines to get the ktime_t math right in the timespec
- * representation. The macros are sometimes ugly - their actual use is
- * pretty okay-ish, given the circumstances. We do all this for
- * performance reasons. The pure scalar nsec_t based code was nice and
- * simple, but created too many 64-bit / 32-bit conversions and divisions.
- *
- * Be especially aware that negative values are represented in a way
- * that the tv.sec field is negative and the tv.nsec field is greater
- * or equal to zero but less than nanoseconds per second. This is the
- * same representation which is used by timespecs.
- *
- * tv.sec < 0 and 0 >= tv.nsec < NSEC_PER_SEC
- */
-
-/* Set a ktime_t variable to a value in sec/nsec representation: */
-static inline ktime_t ktime_set(const long secs, const unsigned long nsecs)
-{
- return (ktime_t) { .tv = { .sec = secs, .nsec = nsecs } };
-}
-
-/**
- * ktime_sub - subtract two ktime_t variables
- * @lhs: minuend
- * @rhs: subtrahend
- *
- * Returns the remainder of the subtraction
- */
-static inline ktime_t ktime_sub(const ktime_t lhs, const ktime_t rhs)
+static inline ktime_t
+ktime_add_ns(ktime_t kt, int64_t ns)
{
ktime_t res;
- res.tv64 = lhs.tv64 - rhs.tv64;
- if (res.tv.nsec < 0)
- res.tv.nsec += NSEC_PER_SEC;
-
- return res;
+ res.tv64 = kt.tv64 + ns;
+ return kt;
}
-/**
- * ktime_add - add two ktime_t variables
- * @add1: addend1
- * @add2: addend2
- *
- * Returns the sum of @add1 and @add2.
- */
-static inline ktime_t ktime_add(const ktime_t add1, const ktime_t add2)
+static inline ktime_t
+ktime_sub_ns(ktime_t kt, int64_t ns)
{
ktime_t res;
- res.tv64 = add1.tv64 + add2.tv64;
- /*
- * performance trick: the (u32) -NSEC gives 0x00000000Fxxxxxxx
- * so we subtract NSEC_PER_SEC and add 1 to the upper 32 bit.
- *
- * it's equivalent to:
- * tv.nsec -= NSEC_PER_SEC
- * tv.sec ++;
- */
- if (res.tv.nsec >= NSEC_PER_SEC)
- res.tv64 += (u32)-NSEC_PER_SEC;
-
- return res;
-}
-
-/**
- * ktime_add_ns - Add a scalar nanoseconds value to a ktime_t variable
- * @kt: addend
- * @nsec: the scalar nsec value to add
- *
- * Returns the sum of @kt and @nsec in ktime_t format
- */
-extern ktime_t ktime_add_ns(const ktime_t kt, u64 nsec);
-
-/**
- * ktime_sub_ns - Subtract a scalar nanoseconds value from a ktime_t variable
- * @kt: minuend
- * @nsec: the scalar nsec value to subtract
- *
- * Returns the subtraction of @nsec from @kt in ktime_t format
- */
-extern ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec);
+ res.tv64 = kt.tv64 - ns;
+ return kt;
+}
-/**
- * timespec_to_ktime - convert a timespec to ktime_t format
- * @ts: the timespec variable to convert
- *
- * Returns a ktime_t variable with the converted timespec value
- */
-static inline ktime_t timespec_to_ktime(const struct timespec ts)
+static inline ktime_t
+ktime_set(const long secs, const unsigned long nsecs)
{
- return (ktime_t) { .tv = { .sec = (s32)ts.tv_sec,
- .nsec = (s32)ts.tv_nsec } };
+ ktime_t retval = { (s64)secs * NSEC_PER_SEC + (s64)nsecs };
+ return (retval);
}
-/**
- * timeval_to_ktime - convert a timeval to ktime_t format
- * @tv: the timeval variable to convert
- *
- * Returns a ktime_t variable with the converted timeval value
- */
-static inline ktime_t timeval_to_ktime(const struct timeval tv)
+static inline ktime_t
+ktime_sub(ktime_t lhs, ktime_t rhs)
{
- return (ktime_t) { .tv = { .sec = (s32)tv.tv_sec,
- .nsec = (s32)(tv.tv_usec *
- NSEC_PER_USEC) } };
+ lhs.tv64 -= rhs.tv64;
+ return (lhs);
}
-/**
- * ktime_to_timespec - convert a ktime_t variable to timespec format
- * @kt: the ktime_t variable to convert
- *
- * Returns the timespec representation of the ktime value
- */
-static inline struct timespec ktime_to_timespec(const ktime_t kt)
+static inline ktime_t
+ktime_add(ktime_t lhs, ktime_t rhs)
{
- return (struct timespec) { .tv_sec = (time_t) kt.tv.sec,
- .tv_nsec = (long) kt.tv.nsec };
+ lhs.tv64 += rhs.tv64;
+ return (lhs);
}
-/**
- * ktime_to_timeval - convert a ktime_t variable to timeval format
- * @kt: the ktime_t variable to convert
- *
- * Returns the timeval representation of the ktime value
- */
-static inline struct timeval ktime_to_timeval(const ktime_t kt)
+static inline ktime_t
+timespec_to_ktime(struct timespec ts)
{
- return (struct timeval) {
- .tv_sec = (time_t) kt.tv.sec,
- .tv_usec = (suseconds_t) (kt.tv.nsec / NSEC_PER_USEC) };
+ return (ktime_set(ts.tv_sec, ts.tv_nsec));
}
-/**
- * ktime_to_ns - convert a ktime_t variable to scalar nanoseconds
- * @kt: the ktime_t variable to convert
- *
- * Returns the scalar nanoseconds representation of @kt
- */
-static inline s64 ktime_to_ns(const ktime_t kt)
+static inline ktime_t
+timeval_to_ktime(struct timeval tv)
{
- return (s64) kt.tv.sec * NSEC_PER_SEC + kt.tv.nsec;
+ return (ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC));
}
-#endif /* !((BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR)) */
+#define ktime_to_timespec(kt) ns_to_timespec((kt).tv64)
+#define ktime_to_timeval(kt) ns_to_timeval((kt).tv64)
+#define ktime_to_ns(kt) ((kt).tv64)
-static inline s64 ktime_get_ns(void)
+static inline s64
+ktime_get_ns(void)
{
struct timespec ts;
ktime_t kt;
+
ktime_get_ts(&ts);
kt = timespec_to_ktime(ts);
return (ktime_to_ns(kt));
}
+static inline ktime_t
+ktime_get(void)
+{
+ struct timespec ts;
+
+ ktime_get_ts(&ts);
+ return (timespec_to_ktime(ts));
+}
+
#endif /* _LINUX_KTIME_H */
Index: sys/ofed/include/linux/linux_compat.c
===================================================================
--- sys/ofed/include/linux/linux_compat.c
+++ sys/ofed/include/linux/linux_compat.c
@@ -606,81 +606,30 @@
.fo_sendfile = invfo_sendfile,
};
-/*
- * Hash of vmmap addresses. This is infrequently accessed and does not
- * need to be particularly large. This is done because we must store the
- * caller's idea of the map size to properly unmap.
- */
-struct vmmap {
- LIST_ENTRY(vmmap) vm_next;
- void *vm_addr;
- unsigned long vm_size;
-};
-
-struct vmmaphd {
- struct vmmap *lh_first;
-};
-#define VMMAP_HASH_SIZE 64
-#define VMMAP_HASH_MASK (VMMAP_HASH_SIZE - 1)
-#define VM_HASH(addr) ((uintptr_t)(addr) >> PAGE_SHIFT) & VMMAP_HASH_MASK
-static struct vmmaphd vmmaphead[VMMAP_HASH_SIZE];
-static struct mtx vmmaplock;
-
-static void
-vmmap_add(void *addr, unsigned long size)
+void *
+ioremap(resource_size_t offset, unsigned long size)
{
- struct vmmap *vmmap;
-
- vmmap = kmalloc(sizeof(*vmmap), GFP_KERNEL);
- mtx_lock(&vmmaplock);
- vmmap->vm_size = size;
- vmmap->vm_addr = addr;
- LIST_INSERT_HEAD(&vmmaphead[VM_HASH(addr)], vmmap, vm_next);
- mtx_unlock(&vmmaplock);
+ return (pmap_mapdev_attr(offset, size, VM_MEMATTR_UNCACHEABLE));
}
-static struct vmmap *
-vmmap_remove(void *addr)
+void *
+ioremap_nocache(resource_size_t offset, unsigned long size)
{
- struct vmmap *vmmap;
-
- mtx_lock(&vmmaplock);
- LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next)
- if (vmmap->vm_addr == addr)
- break;
- if (vmmap)
- LIST_REMOVE(vmmap, vm_next);
- mtx_unlock(&vmmaplock);
-
- return (vmmap);
+ return (pmap_mapdev_attr(offset, size, VM_MEMATTR_UNCACHEABLE));
}
void *
-_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr)
+ioremap_wc(resource_size_t offset, unsigned long size)
{
- void *addr;
-
- addr = pmap_mapdev_attr(phys_addr, size, attr);
- if (addr == NULL)
- return (NULL);
- vmmap_add(addr, size);
-
- return (addr);
+ return (pmap_mapdev_attr(offset, size, VM_MEMATTR_WRITE_COMBINING));
}
void
-iounmap(void *addr)
+iounmap(void *addr, unsigned long size)
{
- struct vmmap *vmmap;
-
- vmmap = vmmap_remove(addr);
- if (vmmap == NULL)
- return;
- pmap_unmapdev((vm_offset_t)addr, vmmap->vm_size);
- kfree(vmmap);
+ pmap_unmapdev((vm_offset_t)addr, size);
}
-
void *
vmap(struct page **pages, unsigned int count, unsigned long flags, int prot)
{
@@ -691,23 +640,19 @@
off = kva_alloc(size);
if (off == 0)
return (NULL);
- vmmap_add((void *)off, size);
pmap_qenter(off, pages, count);
return ((void *)off);
}
void
-vunmap(void *addr)
+vunmap(void *addr, unsigned int count)
{
- struct vmmap *vmmap;
+ size_t size;
- vmmap = vmmap_remove(addr);
- if (vmmap == NULL)
- return;
- pmap_qremove((vm_offset_t)addr, vmmap->vm_size / PAGE_SIZE);
- kva_free((vm_offset_t)addr, vmmap->vm_size);
- kfree(vmmap);
+ size = count * PAGE_SIZE;
+ pmap_qremove((vm_offset_t)addr, count);
+ kva_free((vm_offset_t)addr, size);
}
char *
@@ -910,7 +855,6 @@
linux_compat_init(void *arg)
{
struct sysctl_oid *rootoid;
- int i;
rootoid = SYSCTL_ADD_ROOT_NODE(NULL,
OID_AUTO, "sys", CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, "sys");
@@ -929,9 +873,6 @@
INIT_LIST_HEAD(&pci_drivers);
INIT_LIST_HEAD(&pci_devices);
spin_lock_init(&pci_lock);
- mtx_init(&vmmaplock, "IO Map lock", NULL, MTX_DEF);
- for (i = 0; i < VMMAP_HASH_SIZE; i++)
- LIST_INIT(&vmmaphead[i]);
}
SYSINIT(linux_compat, SI_SUB_DRIVERS, SI_ORDER_SECOND, linux_compat_init, NULL);
Index: sys/ofed/include/linux/list.h
===================================================================
--- sys/ofed/include/linux/list.h
+++ sys/ofed/include/linux/list.h
@@ -95,6 +95,15 @@
entry->prev->next = entry->next;
}
+static inline void list_replace(struct list_head *old,
+ struct list_head *new)
+{
+ new->next = old->next;
+ new->next->prev = new;
+ new->prev = old->prev;
+ new->prev->next = new;
+}
+
static inline void
_list_add(struct list_head *new, struct list_head *prev,
struct list_head *next)
@@ -119,6 +128,9 @@
#define list_first_entry(ptr, type, member) \
list_entry((ptr)->next, type, member)
+#define list_next_entry(ptr, member) \
+ list_entry(((ptr)->member.next), typeof(*(ptr)), member)
+
#define list_for_each(p, head) \
for (p = (head)->next; p != (head); p = p->next)
@@ -134,6 +146,15 @@
n = list_entry(p->field.next, typeof(*p), field); &p->field != (h);\
p = n, n = list_entry(n->field.next, typeof(*n), field))
+#define list_for_each_entry_continue(p, h, field) \
+ for (p = list_next_entry((p), field); &p->field != (h); \
+ p = list_next_entry((p), field))
+
+#define list_for_each_entry_safe_from(pos, n, head, member) \
+ for (n = list_entry(pos->member.next, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = n, n = list_entry(n->member.next, typeof(*n), member))
+
#define list_for_each_entry_reverse(p, h, field) \
for (p = list_entry((h)->prev, typeof(*p), field); &p->field != (h); \
p = list_entry(p->field.prev, typeof(*p), field))
@@ -381,10 +402,14 @@
#define hlist_for_each_safe(p, n, head) \
for (p = (head)->first; p && ({ n = p->next; 1; }); p = n)
-#define hlist_for_each_entry(tp, p, head, field) \
- for (p = (head)->first; \
- p ? (tp = hlist_entry(p, typeof(*tp), field)): NULL; p = p->next)
-
+#define hlist_entry_safe(ptr, type, member) \
+ ((ptr) ? hlist_entry(ptr, type, member) : NULL)
+
+#define hlist_for_each_entry(pos, head, member) \
+ for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
+ pos; \
+ pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
+
#define hlist_for_each_entry_continue(tp, p, field) \
for (p = (p)->next; \
p ? (tp = hlist_entry(p, typeof(*tp), field)): NULL; p = p->next)
@@ -398,4 +423,8 @@
tpos = hlist_entry((pos), typeof(*(tpos)), member); 1;}); \
pos = (n))
+#define hlist_add_head_rcu(n, h) hlist_add_head(n, h)
+
+#define hlist_del_init_rcu(n) hlist_del_init(n)
+
#endif /* _LINUX_LIST_H_ */
Index: sys/ofed/include/linux/math64.h
===================================================================
--- sys/ofed/include/linux/math64.h
+++ sys/ofed/include/linux/math64.h
@@ -32,7 +32,7 @@
#include <linux/bitops.h>
#if BITS_PER_LONG == 64
-
+
# define do_div(n, base) ({ \
uint32_t __base = (base); \
uint32_t __rem; \
@@ -53,6 +53,15 @@
return dividend / divisor;
}
+static inline u64 div64_u64(u64 dividend, u64 divisor)
+{
+ return dividend / divisor;
+}
+
+static inline s64 div64_s64(s64 dividend, s64 divisor)
+{
+ return dividend / divisor;
+}
#elif BITS_PER_LONG == 32
@@ -88,7 +97,7 @@
*n = res;
return rem;
}
-
+
# define do_div(n, base) ({ \
uint32_t __base = (base); \
uint32_t __rem; \
@@ -108,7 +117,6 @@
return dividend;
}
#endif
-
#endif /* BITS_PER_LONG */
Index: sys/ofed/include/linux/mm.h
===================================================================
--- sys/ofed/include/linux/mm.h
+++ sys/ofed/include/linux/mm.h
@@ -2,7 +2,9 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2015 François Tigeot
+ * Copyright (c) 2015 Matthew Dillon <dillon@backplane.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -84,4 +86,28 @@
return (0);
}
+static inline unsigned long
+vma_pages(struct vm_area_struct *vma)
+{
+ unsigned long size;
+
+ size = vma->vm_end - vma->vm_start;
+
+ return size >> PAGE_SHIFT;
+}
+
+#define offset_in_page(off) ((off) & PAGE_MASK)
+
+static inline void
+set_page_dirty(struct vm_page *page)
+{
+ vm_page_dirty(page);
+}
+
+static inline void
+get_page(struct vm_page *page)
+{
+ vm_page_hold(page);
+}
+
#endif /* _LINUX_MM_H_ */
Index: sys/ofed/include/linux/moduleparam.h
===================================================================
--- sys/ofed/include/linux/moduleparam.h
+++ sys/ofed/include/linux/moduleparam.h
@@ -48,7 +48,7 @@
u16 flags;
param_set_fn set;
param_get_fn get;
- union {
+ union {
void *arg;
struct kparam_string *str;
struct kparam_array *arr;
@@ -83,8 +83,8 @@
SYSINIT(name##_param_sysinit, SI_SUB_DRIVERS, SI_ORDER_FIRST, \
param_sysinit, &__param_##name);
-#define module_param_string(name, string, len, perm)
-
+#define module_param_string(name, string, len, perm)
+
#define module_param_named(name, var, type, mode) \
module_param_call(name, param_set_##type, param_get_##type, &var, mode)
@@ -118,7 +118,7 @@
return 0;
}
-static inline int
+static inline int
param_get_short(char *buffer, struct kernel_param *kp)
{
@@ -126,14 +126,14 @@
}
-static inline int
+static inline int
param_set_ushort(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_ushort(char *buffer, struct kernel_param *kp)
{
@@ -141,14 +141,14 @@
}
-static inline int
+static inline int
param_set_int(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_int(char *buffer, struct kernel_param *kp)
{
@@ -156,14 +156,14 @@
}
-static inline int
+static inline int
param_set_uint(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_uint(char *buffer, struct kernel_param *kp)
{
@@ -171,14 +171,14 @@
}
-static inline int
+static inline int
param_set_long(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_long(char *buffer, struct kernel_param *kp)
{
@@ -186,14 +186,14 @@
}
-static inline int
+static inline int
param_set_ulong(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_ulong(char *buffer, struct kernel_param *kp)
{
@@ -201,14 +201,14 @@
}
-static inline int
+static inline int
param_set_charp(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_charp(char *buffer, struct kernel_param *kp)
{
@@ -216,14 +216,14 @@
}
-static inline int
+static inline int
param_set_bool(const char *val, struct kernel_param *kp)
{
return 0;
}
-static inline int
+static inline int
param_get_bool(char *buffer, struct kernel_param *kp)
{
Index: sys/ofed/include/linux/scatterlist.h
===================================================================
--- sys/ofed/include/linux/scatterlist.h
+++ sys/ofed/include/linux/scatterlist.h
@@ -3,6 +3,7 @@
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
* Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2015 Matthew Dillon <dillon@backplane.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -64,6 +65,12 @@
unsigned int orig_nents; /* original size of list */
};
+struct sg_page_iter {
+ struct scatterlist *sg;
+ unsigned int sg_pgoffset; /* page index */
+ unsigned int maxents;
+};
+
/*
* Maximum number of entries that will be allocated in one piece, if
* a list larger than this is required then chaining will be utilized.
@@ -326,6 +333,66 @@
return ret;
}
+/*
+ * Iterate pages in sg list.
+ */
+static inline void
+_sg_iter_next(struct sg_page_iter *iter)
+{
+ struct scatterlist *sg;
+ unsigned int pgcount;
+
+ sg = iter->sg;
+ pgcount = (sg->offset + sg->length + PAGE_MASK) >> PAGE_SHIFT;
+
+ ++iter->sg_pgoffset;
+ while (iter->sg_pgoffset >= pgcount) {
+ iter->sg_pgoffset -= pgcount;
+ sg = sg_next(sg);
+ --iter->maxents;
+ if (sg == NULL || iter->maxents == 0)
+ break;
+ pgcount = (sg->offset + sg->length + PAGE_MASK) >> PAGE_SHIFT;
+ }
+ iter->sg = sg;
+}
+
+/*
+ * NOTE: pgoffset is really a page index, not a byte offset.
+ */
+static inline void
+_sg_iter_init(struct scatterlist *sgl, struct sg_page_iter *iter,
+ unsigned int nents, unsigned long pgoffset)
+{
+ if (nents) {
+ /*
+ * Nominal case. Note subtract 1 from starting page index
+ * for initial _sg_iter_next() call.
+ */
+ iter->sg = sgl;
+ iter->sg_pgoffset = pgoffset - 1;
+ iter->maxents = nents;
+ _sg_iter_next(iter);
+ } else {
+ /*
+ * Degenerate case
+ */
+ iter->sg = NULL;
+ iter->sg_pgoffset = 0;
+ iter->maxents = 0;
+ }
+}
+
+static inline dma_addr_t
+sg_page_iter_dma_address(struct sg_page_iter *spi)
+{
+ return spi->sg->address + (spi->sg_pgoffset << PAGE_SHIFT);
+}
+
+#define for_each_sg_page(sgl, iter, nents, pgoffset) \
+ for (_sg_iter_init(sgl, iter, nents, pgoffset); \
+ (iter)->sg; _sg_iter_next(iter))
+
#define for_each_sg(sglist, sg, sgmax, _itr) \
for (_itr = 0, sg = (sglist); _itr < (sgmax); _itr++, sg = sg_next(sg))
Index: sys/ofed/include/linux/sched.h
===================================================================
--- sys/ofed/include/linux/sched.h
+++ sys/ofed/include/linux/sched.h
@@ -107,4 +107,15 @@
#define sched_yield() sched_relinquish(curthread)
+static inline long
+schedule_timeout(signed long timeout)
+{
+ if (timeout < 0)
+ return 0;
+
+ pause("lstim", timeout);
+
+ return 0;
+}
+
#endif /* _LINUX_SCHED_H_ */
Index: sys/ofed/include/linux/time.h
===================================================================
--- sys/ofed/include/linux/time.h
+++ sys/ofed/include/linux/time.h
@@ -0,0 +1,131 @@
+/* $FreeBSD$ */
+/*
+ * Copyright (c) 2014-2015 François Tigeot
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LINUX_TIME_H_
+#define _LINUX_TIME_H_
+
+#define NSEC_PER_USEC 1000L
+#define NSEC_PER_SEC 1000000000L
+
+#include <sys/time.h>
+#include <sys/stdint.h>
+
+static inline struct timeval
+ns_to_timeval(const int64_t nsec)
+{
+ struct timeval tv;
+ long rem;
+
+ if (nsec == 0) {
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ return (tv);
+ }
+
+ tv.tv_sec = nsec / NSEC_PER_SEC;
+ rem = nsec % NSEC_PER_SEC;
+ if (rem < 0) {
+ tv.tv_sec--;
+ rem += NSEC_PER_SEC;
+ }
+ tv.tv_usec = rem / 1000;
+ return (tv);
+}
+
+static inline int64_t
+timeval_to_ns(const struct timeval *tv)
+{
+ return ((int64_t)tv->tv_sec * NSEC_PER_SEC) +
+ tv->tv_usec * NSEC_PER_USEC;
+}
+
+#define getrawmonotonic(ts) nanouptime(ts)
+
+static inline struct timespec
+timespec_sub(struct timespec lhs, struct timespec rhs)
+{
+ struct timespec ts;
+
+ ts.tv_sec = lhs.tv_sec;
+ ts.tv_nsec = lhs.tv_nsec;
+ timespecsub(&ts, &rhs);
+
+ return ts;
+}
+
+static inline void
+set_normalized_timespec(struct timespec *ts, time_t sec, int64_t nsec)
+{
+ /* XXX: this doesn't actually normalize anything */
+ ts->tv_sec = sec;
+ ts->tv_nsec = nsec;
+}
+
+static inline int64_t
+timespec_to_ns(const struct timespec *ts)
+{
+ return ((ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec);
+}
+
+static inline struct timespec
+ns_to_timespec(const int64_t nsec)
+{
+ struct timespec ts;
+ int32_t rem;
+
+ if (nsec == 0) {
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ return (ts);
+ }
+
+ ts.tv_sec = nsec / NSEC_PER_SEC;
+ rem = nsec % NSEC_PER_SEC;
+ if (rem < 0) {
+ ts.tv_sec--;
+ rem += NSEC_PER_SEC;
+ }
+ ts.tv_nsec = rem;
+ return (ts);
+}
+
+static inline int
+timespec_valid(const struct timespec *ts)
+{
+ if (ts->tv_sec < 0 || ts->tv_sec > 100000000 ||
+ ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000)
+ return (0);
+ return (1);
+}
+
+static inline unsigned long
+get_seconds(void)
+{
+ return time_uptime;
+}
+
+#endif /* _LINUX_TIME_H_ */
Index: sys/ofed/include/linux/types.h
===================================================================
--- sys/ofed/include/linux/types.h
+++ sys/ofed/include/linux/types.h
@@ -36,8 +36,6 @@
#include <linux/compiler.h>
#include <asm/types.h>
-#define __read_mostly __attribute__((__section__(".data.read_mostly")))
-
#ifndef __bitwise__
#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
Index: sys/ofed/include/linux/uaccess.h
===================================================================
--- sys/ofed/include/linux/uaccess.h
+++ sys/ofed/include/linux/uaccess.h
@@ -2,7 +2,8 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
+ * Copyright (c) 2015 François Tigeot
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,4 +33,14 @@
#define get_user(_x, _p) -copyin((_p), &(_x), sizeof(*(_p)))
#define put_user(_x, _p) -copyout(&(_x), (_p), sizeof(*(_p)))
+static inline void pagefault_disable(void)
+{
+ curthread_pflags_set(TDP_NOFAULTING | TDP_RESETSPUR);
+}
+
+static inline void pagefault_enable(void)
+{
+ curthread_pflags_restore(~(TDP_NOFAULTING | TDP_RESETSPUR));
+}
+
#endif /* _LINUX_UACCESS_H_ */
Index: sys/ofed/include/linux/vmalloc.h
===================================================================
--- sys/ofed/include/linux/vmalloc.h
+++ sys/ofed/include/linux/vmalloc.h
@@ -37,6 +37,6 @@
void *vmap(struct page **pages, unsigned int count, unsigned long flags,
int prot);
-void vunmap(void *addr);
+void vunmap(void *addr, unsigned int count);
#endif /* _LINUX_VMALLOC_H_ */
Index: sys/ofed/include/linux/wait.h
===================================================================
--- sys/ofed/include/linux/wait.h
+++ sys/ofed/include/linux/wait.h
@@ -39,15 +39,18 @@
#include <sys/kernel.h>
#include <sys/proc.h>
-struct __wait_queue_head {
+typedef struct {
+} wait_queue_t;
+
+typedef struct {
unsigned int wchan;
-};
-typedef struct __wait_queue_head wait_queue_head_t;
+} wait_queue_head_t;
-#define init_waitqueue_head(x)
+#define init_waitqueue_head(x) \
+ do { } while (0)
static inline void
-__wake_up(struct __wait_queue_head *q, int all)
+__wake_up(wait_queue_head_t *q, int all)
{
int wakeup_swapper;
void *c;
@@ -108,6 +111,23 @@
-_error; \
})
-#define DEFINE_WAIT(x)
+static inline int
+waitqueue_active(wait_queue_head_t *q)
+{
+ return 0; /* XXX: not really implemented */
+}
+
+#define DEFINE_WAIT(name) \
+ wait_queue_t name = {}
+
+static inline void
+prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
+{
+}
+
+static inline void
+finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
+{
+}
#endif /* _LINUX_WAIT_H_ */
Index: sys/ofed/include/linux/workqueue.h
===================================================================
--- sys/ofed/include/linux/workqueue.h
+++ sys/ofed/include/linux/workqueue.h
@@ -91,11 +91,11 @@
#define flush_scheduled_work() flush_taskqueue(taskqueue_thread)
-static inline int queue_work (struct workqueue_struct *q, struct work_struct *work)
+static inline int queue_work(struct workqueue_struct *q, struct work_struct *work)
{
(work)->taskqueue = (q)->taskqueue;
/* Return opposite val to align with Linux logic */
- return !taskqueue_enqueue((q)->taskqueue, &(work)->work_task);
+ return !taskqueue_enqueue((q)->taskqueue, &(work)->work_task);
}
static inline void
@@ -151,6 +151,12 @@
#define create_workqueue(name) \
_create_workqueue_common(name, MAXCPU)
+#define alloc_ordered_workqueue(name, flags) \
+ _create_workqueue_common(name, 1)
+
+#define alloc_workqueue(name, flags, max_active) \
+ _create_workqueue_common(name, max_active)
+
static inline void
destroy_workqueue(struct workqueue_struct *wq)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 10, 2:49 PM (9 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25085012
Default Alt Text
D3835.id9213.diff (72 KB)
Attached To
Mode
D3835: Update LinuxKPI layer in FreeBSD-11-current
Attached
Detach File
Event Timeline
Log In to Comment