[Openib-windows] RE: [PATCH] Support 32-bit kernel bypass on 64-bit kernel
Leonid Keller
leonid at mellanox.co.il
Mon Jan 30 09:01:46 PST 2006
Hi Fab,
I'd like first to understand the reasons of adding of this patch.
I mean, we are preparing now a new release, which will support the work
of 32-bit applications over a 64-bit kernel.
Therefore I don't see as worth an effort of adding and testing of your
patch.
What do you think ?
> -----Original Message-----
> From: Tzachi Dar
> Sent: Thursday, January 26, 2006 2:11 PM
> To: Leonid Keller
> Cc: Erez Cohen
> Subject: FW: [PATCH] Support 32-bit kernel bypass on 64-bit kernel
>
> leonid, please take care.
>
> -----Original Message-----
> From: Fab Tillier [mailto:ftillier at silverstorm.com]
> Sent: Thursday, January 26, 2006 7:09 AM
> To: Tzachi Dar
> Cc: openib-windows at openib.org
> Subject: [PATCH] Support 32-bit kernel bypass on 64-bit kernel
>
> Hi Tzachi,
>
> Here's a patch that adds support for a 32-bit app taking
> advantage of kernel bypass functionality when running on a
> 64-bit kernel.
>
> This patch changes the structure definitions for any
> structures that are exchanged between user-mode and
> kernel-mode so that they are the same size regardless of
> architecture. Most of the changes take advantage of the
> unnamed union support so that the original type doesn't have
> to change, avoiding a myriad of truncation cast errors. All
> embedded pointers in these structures are decorated with the
> __ptr64 keyword, which makes them 64-bits wide even on 32-bit
> platforms.
>
> Please take a look and commit as you see fit.
>
> - Fab
>
> Signed-off-by: Fab Tillier (ftillier at silverstorm.com)
>
> Index: hw/mt23108/vapi/Hca/hcahal/hh.h
> ===================================================================
> --- hw/mt23108/vapi/Hca/hcahal/hh.h (revision 215)
> +++ hw/mt23108/vapi/Hca/hcahal/hh.h (working copy)
> @@ -62,28 +62,48 @@
> * Device information (public object/context)
> *
> */
> -
> +#pragma warning( disable : 4201 )
> typedef struct HH_hca_dev_st {
> - char *dev_desc; /* Device
> description (name, etc.) */
> - char *user_lib; /* User level
> library (dyn-link) */
> + char * __ptr64 dev_desc; /* Device
> description (name,
> etc.) */
> + char * __ptr64 user_lib; /* User
> level library
> (dyn-link) */
> u_int32_t vendor_id; /* IEEE's 24 bit
> Device Vendor ID */
> u_int32_t dev_id; /* Device ID */
> u_int32_t hw_ver; /* Hardware version
> (step/rev) */
> u_int64_t fw_ver;
> - struct hh_if_ops* if_ops; /* Interface operations */
> + struct hh_if_ops* __ptr64 if_ops; /* Interface
> operations */
>
> /* Size (bytes) of
> user-level ... */
> + union
> + {
> MT_size_t hca_ul_resources_sz; /* .. resources
> context for an HCA */
> + void* __ptr64 resv0;
> + };
> + union
> + {
> MT_size_t pd_ul_resources_sz; /* .. resources
> context for a PD */
> + void* __ptr64 resv1;
> + };
> + union
> + {
> MT_size_t cq_ul_resources_sz; /* .. resources
> context for a CQ */
> + void* __ptr64 resv2;
> + };
> + union
> + {
> MT_size_t srq_ul_resources_sz; /* .. resources
> context for a SRQ */
> + void* __ptr64 resv3;
> + };
> + union
> + {
> MT_size_t qp_ul_resources_sz; /* .. resources
> context for a QP */
> + void* __ptr64 resv4;
> + };
>
> - void* device; /* Device private data */
> + void* __ptr64 device; /* Device
> private data */
> HH_hca_status_t status; /* Device Status */
> } HH_hca_dev_t;
> +#pragma warning( default : 4201 )
>
> -
> typedef enum {
> HH_TPT_PAGE,
> HH_TPT_BUF,
> Index: hw/mt23108/vapi/Hca/hcahal/tavor/thh_common.h
> ===================================================================
> --- hw/mt23108/vapi/Hca/hcahal/tavor/thh_common.h (revision 215)
> +++ hw/mt23108/vapi/Hca/hcahal/tavor/thh_common.h (working copy)
> @@ -54,6 +54,8 @@
> typedef struct THH_uar_st *THH_uar_t;
>
>
> +#pragma warning( disable : 4201 )
> +
> /* VERSION INFORMATION: used in order to retrieve major
> version numbers
> in order to deal with differences in different versions.
> */ typedef struct THH_ver_info_st { @@ -68,12 +70,16 @@
> HH_hca_hndl_t hh_hca_hndl;
> THH_ver_info_t version;
> THH_uar_index_t uar_index;
> + union
> + {
> MT_virt_addr_t uar_map;
> + void* __ptr64 resv0;
> + };
> /* HCA capabilities to validate or use in THHUL */
> MT_bool priv_ud_av; /* Privileged UD AV are enforced ? */
> u_int32_t log2_mpt_size;
> - char *av_ddr_base;
> - char *av_host_base;
> + char * __ptr64 av_ddr_base;
> + char * __ptr64 av_host_base;
>
> u_int32_t max_qp_ous_wr; /* Maximum Number of
> oustanding WR on
> any WQ. */
> u_int32_t max_srq_ous_wr; /* Maximum Number of
> oustanding WR on
> any WQ. */
> @@ -90,34 +96,71 @@
> * needed. Therefore, the udavm_buf_size value is the
> size of the actual udavm
> * table, not the size of the malloc'ed buffer.
> */
> + union
> + {
> MT_virt_addr_t udavm_buf; /* IN */
> + void* __ptr64 resv0;
> + };
> + union
> + {
> MT_size_t udavm_buf_sz; /* IN */
> + void* __ptr64 resv1;
> + };
> HH_pdm_pd_flags_t pd_flags; /* IN - if non-zero,
> is a PD for a
> special QP*/
> VAPI_lkey_t udavm_buf_memkey; /* OUT - set by THH_uldm */
> } THH_pd_ul_resources_t;
>
> typedef struct
> {
> + union
> + {
> MT_virt_addr_t cqe_buf; /* CQE buffer virtual
> addr. CQE size aligned
> */
> + void* __ptr64 resv0;
> + };
> + union
> + {
> MT_size_t cqe_buf_sz; /* Buffer size in bytes
> (mult of CQE size) */
> + void* __ptr64 resv1;
> + };
> THH_uar_index_t uar_index; /* Index of UAR used for this CQ. */
> u_int32_t new_producer_index; /* New producer
> index after
> "resize_cq" (OUT)*/
> } THH_cq_ul_resources_t;
>
> typedef struct
> {
> + union
> + {
> MT_virt_addr_t wqes_buf; /* WQEs buffer virtual address */
> + void* __ptr64 resv0;
> + };
> + union
> + {
> MT_size_t wqes_buf_sz; /* Buffer size in bytes */
> + void* __ptr64 resv1;
> + };
> THH_uar_index_t uar_index; /* index of UAR used for this QP */
> /* ER: Not used anywhere: MT_virt_addr_t uar_map;
> */ /* Address in
> user space of UAR */
> } THH_qp_ul_resources_t;
>
> typedef struct
> {
> + union
> + {
> MT_virt_addr_t wqes_buf; /* WQEs buffer virtual address */
> + void* __ptr64 resv0;
> + };
> + union
> + {
> MT_size_t wqes_buf_sz; /* Buffer size in bytes */
> + void* __ptr64 resv1;
> + };
> + union
> + {
> MT_size_t wqe_sz; /* WQE (descriptor) size
> in bytes */
> + void* __ptr64 resv2;
> + };
> THH_uar_index_t uar_index; /* index of UAR used for
> this QP */
> } THH_srq_ul_resources_t;
>
> +#pragma warning( default : 4201 )
> #endif /* H_THH_COMMON_H */
> Index: hw/mt23108/vapi/Hca/hcahal/tavor/thh_hob/thh_hob.h
> ===================================================================
> --- hw/mt23108/vapi/Hca/hcahal/tavor/thh_hob/thh_hob.h (revision 215)
> +++ hw/mt23108/vapi/Hca/hcahal/tavor/thh_hob/thh_hob.h (working copy)
> @@ -336,8 +336,8 @@
> DLL_API HH_ret_t THH_hob_free_ul_res(HH_hca_hndl_t
> hca_hndl,void *hca_ul_resources_p); DLL_API HH_ret_t
> THH_hob_alloc_pd(HH_hca_hndl_t hca_hndl,
> MOSAL_protection_ctx_t prot_ctx, void *
> pd_ul_resources_p,HH_pd_hndl_t *pd_num_p); DLL_API HH_ret_t
> THH_hob_free_pd(HH_hca_hndl_t hca_hndl, HH_pd_hndl_t pd_num);
> -DLL_API HH_ret_t THH_hob_alloc_rdd(HH_hca_dev_t *hh_dev_p,
> HH_rdd_hndl_t *rdd_p); -DLL_API HH_ret_t
> THH_hob_free_rdd(HH_hca_dev_t *hh_dev_p, HH_rdd_hndl_t rdd);
> +DLL_API HH_ret_t THH_hob_alloc_rdd(HH_hca_hndl_t hh_dev_p,
> +HH_rdd_hndl_t
> *rdd_p);
> +DLL_API HH_ret_t THH_hob_free_rdd(HH_hca_hndl_t hh_dev_p,
> HH_rdd_hndl_t
> +rdd);
> DLL_API HH_ret_t THH_hob_create_ud_av(HH_hca_hndl_t
> hca_hndl,HH_pd_hndl_t pd,VAPI_ud_av_t *av_p, HH_ud_av_hndl_t
> *ah_p); DLL_API HH_ret_t THH_hob_modify_ud_av(HH_hca_hndl_t
> hca_hndl, HH_ud_av_hndl_t ah,VAPI_ud_av_t *av_p); DLL_API
> HH_ret_t THH_hob_query_ud_av(HH_hca_hndl_t hca_hndl,
> HH_ud_av_hndl_t ah,VAPI_ud_av_t *av_p);
> Index: hw/mt23108/vapi/Hca/hcahal/tavor/thh_hob/thh_hob.c
> ===================================================================
> --- hw/mt23108/vapi/Hca/hcahal/tavor/thh_hob/thh_hob.c (revision 215)
> +++ hw/mt23108/vapi/Hca/hcahal/tavor/thh_hob/thh_hob.c (working copy)
> @@ -5000,7 +5000,7 @@
>
> /*************************************************************
> *****************
> * Function: THH_hob_alloc_rdd <==> THH_eecm_alloc_rdd
>
> **************************************************************
> ***************/
> -HH_ret_t THH_hob_alloc_rdd(HH_hca_dev_t *hh_dev_p,
> +HH_ret_t THH_hob_alloc_rdd(HH_hca_hndl_t hh_dev_p,
> HH_rdd_hndl_t *rdd_p) {
> #if 0 @@ -5039,7 +5039,7 @@
>
> /*************************************************************
> *****************
> * Function: THH_hob_free_rdd <==> THH_eecm_free_rdd
>
> **************************************************************
> ***************/
> -HH_ret_t THH_hob_free_rdd(HH_hca_dev_t *hh_dev_p, HH_rdd_hndl_t rdd)
> +HH_ret_t THH_hob_free_rdd(HH_hca_hndl_t hh_dev_p, HH_rdd_hndl_t rdd)
> {
> #if 0
> THH_hob_t thh_hob_p;
> Index: hw/mt23108/vapi/Hca/hcahal/hh_common.h
> ===================================================================
> --- hw/mt23108/vapi/Hca/hcahal/hh_common.h (revision 215)
> +++ hw/mt23108/vapi/Hca/hcahal/hh_common.h (working copy)
> @@ -44,7 +44,7 @@
> *
> */
>
> -typedef struct HH_hca_dev_st* HH_hca_hndl_t;
> +typedef struct HH_hca_dev_st* __ptr64 HH_hca_hndl_t;
> typedef struct HHUL_sr_wqe_st HHUL_sr_wqe_t; typedef
> struct HHUL_rr_wqe_st HHUL_rr_wqe_t;
>
> Index: hw/mt23108/user/hca_data.h
> ===================================================================
> --- hw/mt23108/user/hca_data.h (revision 215)
> +++ hw/mt23108/user/hca_data.h (working copy)
> @@ -35,7 +35,7 @@
>
> typedef struct _ib_ca
> {
> - HH_hca_dev_t *p_hca_ul_info;
> + HH_hca_dev_t * __ptr64 p_hca_ul_info;
> void *p_hca_ul_resources;
> ib_ca_attr_t *p_hca_attr;
> HHUL_hca_hndl_t hhul_hca_hndl;
>
More information about the ofw
mailing list