virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH V4 1/7] vDPA/ifcvf: get_vendor_id returns a device specific vendor id
       [not found] ` <20210315074501.15868-2-lingshan.zhu@intel.com>
@ 2021-03-16  6:09   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-16  6:09 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:44, Zhu Lingshan 写道:
> In this commit, ifcvf_get_vendor_id() will return
> a device specific vendor id of the probed pci device
> than a hard code.
>
> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index fa1af301cf55..e501ee07de17 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -324,7 +324,10 @@ static u32 ifcvf_vdpa_get_device_id(struct vdpa_device *vdpa_dev)
>   
>   static u32 ifcvf_vdpa_get_vendor_id(struct vdpa_device *vdpa_dev)
>   {
> -	return IFCVF_SUBSYS_VENDOR_ID;
> +	struct ifcvf_adapter *adapter = vdpa_to_adapter(vdpa_dev);
> +	struct pci_dev *pdev = adapter->pdev;
> +
> +	return pdev->subsystem_vendor;
>   }
>   
>   static u32 ifcvf_vdpa_get_vq_align(struct vdpa_device *vdpa_dev)

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V4 2/7] vDPA/ifcvf: enable Intel C5000X-PL virtio-net for vDPA
       [not found] ` <20210315074501.15868-3-lingshan.zhu@intel.com>
@ 2021-03-16  6:09   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-16  6:09 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:44, Zhu Lingshan 写道:
> This commit enabled Intel FPGA SmartNIC C5000X-PL virtio-net
> for vDPA
>
> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/vdpa/ifcvf/ifcvf_base.h | 5 +++++
>   drivers/vdpa/ifcvf/ifcvf_main.c | 5 +++++
>   2 files changed, 10 insertions(+)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
> index 64696d63fe07..75d9a8052039 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_base.h
> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h
> @@ -23,6 +23,11 @@
>   #define IFCVF_SUBSYS_VENDOR_ID	0x8086
>   #define IFCVF_SUBSYS_DEVICE_ID	0x001A
>   
> +#define C5000X_PL_VENDOR_ID		0x1AF4
> +#define C5000X_PL_DEVICE_ID		0x1000
> +#define C5000X_PL_SUBSYS_VENDOR_ID	0x8086
> +#define C5000X_PL_SUBSYS_DEVICE_ID	0x0001
> +
>   #define IFCVF_SUPPORTED_FEATURES \
>   		((1ULL << VIRTIO_NET_F_MAC)			| \
>   		 (1ULL << VIRTIO_F_ANY_LAYOUT)			| \
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index e501ee07de17..26a2dab7ca66 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -484,6 +484,11 @@ static struct pci_device_id ifcvf_pci_ids[] = {
>   		IFCVF_DEVICE_ID,
>   		IFCVF_SUBSYS_VENDOR_ID,
>   		IFCVF_SUBSYS_DEVICE_ID) },
> +	{ PCI_DEVICE_SUB(C5000X_PL_VENDOR_ID,
> +			 C5000X_PL_DEVICE_ID,
> +			 C5000X_PL_SUBSYS_VENDOR_ID,
> +			 C5000X_PL_SUBSYS_DEVICE_ID) },
> +
>   	{ 0 },
>   };
>   MODULE_DEVICE_TABLE(pci, ifcvf_pci_ids);

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V4 3/7] vDPA/ifcvf: rename original IFCVF dev ids to N3000 ids
       [not found] ` <20210315074501.15868-4-lingshan.zhu@intel.com>
@ 2021-03-16  6:10   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-16  6:10 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:44, Zhu Lingshan 写道:
> IFCVF driver probes multiple types of devices now,
> to distinguish the original device driven by IFCVF
> from others, it is renamed as "N3000".
>
> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>


Acked-by: Jason Wang <jasowang@redhat.com>

If you want to have a general driver, you probaby need to rename the driver.

Thanks


> ---
>   drivers/vdpa/ifcvf/ifcvf_base.h | 8 ++++----
>   drivers/vdpa/ifcvf/ifcvf_main.c | 8 ++++----
>   2 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
> index 75d9a8052039..794d1505d857 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_base.h
> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h
> @@ -18,10 +18,10 @@
>   #include <uapi/linux/virtio_config.h>
>   #include <uapi/linux/virtio_pci.h>
>   
> -#define IFCVF_VENDOR_ID		0x1AF4
> -#define IFCVF_DEVICE_ID		0x1041
> -#define IFCVF_SUBSYS_VENDOR_ID	0x8086
> -#define IFCVF_SUBSYS_DEVICE_ID	0x001A
> +#define N3000_VENDOR_ID		0x1AF4
> +#define N3000_DEVICE_ID		0x1041
> +#define N3000_SUBSYS_VENDOR_ID	0x8086
> +#define N3000_SUBSYS_DEVICE_ID	0x001A
>   
>   #define C5000X_PL_VENDOR_ID		0x1AF4
>   #define C5000X_PL_DEVICE_ID		0x1000
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index 26a2dab7ca66..fd5befc5cbcc 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -480,10 +480,10 @@ static void ifcvf_remove(struct pci_dev *pdev)
>   }
>   
>   static struct pci_device_id ifcvf_pci_ids[] = {
> -	{ PCI_DEVICE_SUB(IFCVF_VENDOR_ID,
> -		IFCVF_DEVICE_ID,
> -		IFCVF_SUBSYS_VENDOR_ID,
> -		IFCVF_SUBSYS_DEVICE_ID) },
> +	{ PCI_DEVICE_SUB(N3000_VENDOR_ID,
> +			 N3000_DEVICE_ID,
> +			 N3000_SUBSYS_VENDOR_ID,
> +			 N3000_SUBSYS_DEVICE_ID) },
>   	{ PCI_DEVICE_SUB(C5000X_PL_VENDOR_ID,
>   			 C5000X_PL_DEVICE_ID,
>   			 C5000X_PL_SUBSYS_VENDOR_ID,

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V4 4/7] vDPA/ifcvf: remove the version number string
       [not found] ` <20210315074501.15868-5-lingshan.zhu@intel.com>
@ 2021-03-16  6:11   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-16  6:11 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:44, Zhu Lingshan 写道:
> This commit removes the version number string, using kernel
> version is enough.
>
> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>
> Reviewed-by: Leon Romanovsky <leonro@nvidia.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/vdpa/ifcvf/ifcvf_main.c | 2 --
>   1 file changed, 2 deletions(-)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index fd5befc5cbcc..c34e1eec6b6c 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -14,7 +14,6 @@
>   #include <linux/sysfs.h>
>   #include "ifcvf_base.h"
>   
> -#define VERSION_STRING  "0.1"
>   #define DRIVER_AUTHOR   "Intel Corporation"
>   #define IFCVF_DRIVER_NAME       "ifcvf"
>   
> @@ -503,4 +502,3 @@ static struct pci_driver ifcvf_driver = {
>   module_pci_driver(ifcvf_driver);
>   
>   MODULE_LICENSE("GPL v2");
> -MODULE_VERSION(VERSION_STRING);

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V4 5/7] vDPA/ifcvf: fetch device feature bits when probe
       [not found] ` <20210315074501.15868-6-lingshan.zhu@intel.com>
@ 2021-03-17  3:57   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-17  3:57 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:44, Zhu Lingshan 写道:
> This commit would read and store device feature
> bits when probe.
>
> rename ifcvf_get_features() to ifcvf_get_hw_features(),
> it reads and stores features of the probed device.
>
> new ifcvf_get_features() simply returns stored
> feature bits.
>
> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/vdpa/ifcvf/ifcvf_base.c | 12 ++++++++++--
>   drivers/vdpa/ifcvf/ifcvf_base.h |  2 ++
>   drivers/vdpa/ifcvf/ifcvf_main.c |  2 ++
>   3 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c
> index f2a128e56de5..ea6a78791c9b 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_base.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_base.c
> @@ -202,10 +202,11 @@ static void ifcvf_add_status(struct ifcvf_hw *hw, u8 status)
>   	ifcvf_get_status(hw);
>   }
>   
> -u64 ifcvf_get_features(struct ifcvf_hw *hw)
> +u64 ifcvf_get_hw_features(struct ifcvf_hw *hw)
>   {
>   	struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg;
>   	u32 features_lo, features_hi;
> +	u64 features;
>   
>   	ifc_iowrite32(0, &cfg->device_feature_select);
>   	features_lo = ifc_ioread32(&cfg->device_feature);
> @@ -213,7 +214,14 @@ u64 ifcvf_get_features(struct ifcvf_hw *hw)
>   	ifc_iowrite32(1, &cfg->device_feature_select);
>   	features_hi = ifc_ioread32(&cfg->device_feature);
>   
> -	return ((u64)features_hi << 32) | features_lo;
> +	features = ((u64)features_hi << 32) | features_lo;
> +
> +	return features;
> +}
> +
> +u64 ifcvf_get_features(struct ifcvf_hw *hw)
> +{
> +	return hw->hw_features;
>   }
>   
>   void ifcvf_read_net_config(struct ifcvf_hw *hw, u64 offset,
> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
> index 794d1505d857..dbb8c10aa3b1 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_base.h
> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h
> @@ -83,6 +83,7 @@ struct ifcvf_hw {
>   	void __iomem *notify_base;
>   	u32 notify_off_multiplier;
>   	u64 req_features;
> +	u64 hw_features;
>   	struct virtio_pci_common_cfg __iomem *common_cfg;
>   	void __iomem *net_cfg;
>   	struct vring_info vring[IFCVF_MAX_QUEUE_PAIRS * 2];
> @@ -121,6 +122,7 @@ void ifcvf_set_status(struct ifcvf_hw *hw, u8 status);
>   void io_write64_twopart(u64 val, u32 *lo, u32 *hi);
>   void ifcvf_reset(struct ifcvf_hw *hw);
>   u64 ifcvf_get_features(struct ifcvf_hw *hw);
> +u64 ifcvf_get_hw_features(struct ifcvf_hw *hw);
>   u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid);
>   int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num);
>   struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw);
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index c34e1eec6b6c..25fb9dfe23f0 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -458,6 +458,8 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>   	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++)
>   		vf->vring[i].irq = -EINVAL;
>   
> +	vf->hw_features = ifcvf_get_hw_features(vf);
> +
>   	ret = vdpa_register_device(&adapter->vdpa);
>   	if (ret) {
>   		IFCVF_ERR(pdev, "Failed to register ifcvf to vdpa bus");

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V4 6/7] vDPA/ifcvf: verify mandatory feature bits for vDPA
       [not found] ` <20210315074501.15868-7-lingshan.zhu@intel.com>
@ 2021-03-17  3:58   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-17  3:58 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:45, Zhu Lingshan 写道:
> vDPA requres VIRTIO_F_ACCESS_PLATFORM as a must, this commit
> examines this when set features.
>
> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>
> ---
>   drivers/vdpa/ifcvf/ifcvf_base.c | 12 ++++++++++++
>   drivers/vdpa/ifcvf/ifcvf_base.h |  1 +
>   drivers/vdpa/ifcvf/ifcvf_main.c |  5 +++++
>   3 files changed, 18 insertions(+)
>
> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c
> index ea6a78791c9b..4f257c4b2f76 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_base.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_base.c
> @@ -224,6 +224,18 @@ u64 ifcvf_get_features(struct ifcvf_hw *hw)
>   	return hw->hw_features;
>   }
>   
> +int ifcvf_verify_min_features(struct ifcvf_hw *hw, u64 features)
> +{
> +	struct ifcvf_adapter *ifcvf = vf_to_adapter(hw);
> +
> +	if (!(features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM)) && features) {
> +		IFCVF_ERR(ifcvf->pdev, "VIRTIO_F_ACCESS_PLATFORM not negotiated\n");


Should be "is not negotiated".

Otherwise:

Acked-by: Jason Wang <jasowang@redhat.com>


> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>   void ifcvf_read_net_config(struct ifcvf_hw *hw, u64 offset,
>   			   void *dst, int length)
>   {
> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
> index dbb8c10aa3b1..f77239fc1644 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_base.h
> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h
> @@ -123,6 +123,7 @@ void io_write64_twopart(u64 val, u32 *lo, u32 *hi);
>   void ifcvf_reset(struct ifcvf_hw *hw);
>   u64 ifcvf_get_features(struct ifcvf_hw *hw);
>   u64 ifcvf_get_hw_features(struct ifcvf_hw *hw);
> +int ifcvf_verify_min_features(struct ifcvf_hw *hw, u64 features);
>   u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid);
>   int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num);
>   struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw);
> diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
> index 25fb9dfe23f0..ea93ea7fd5df 100644
> --- a/drivers/vdpa/ifcvf/ifcvf_main.c
> +++ b/drivers/vdpa/ifcvf/ifcvf_main.c
> @@ -179,6 +179,11 @@ static u64 ifcvf_vdpa_get_features(struct vdpa_device *vdpa_dev)
>   static int ifcvf_vdpa_set_features(struct vdpa_device *vdpa_dev, u64 features)
>   {
>   	struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
> +	int ret;
> +
> +	ret = ifcvf_verify_min_features(vf, features);
> +	if (ret)
> +		return ret;
>   
>   	vf->req_features = features;
>   

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V4 7/7] vDPA/ifcvf: deduce VIRTIO device ID from pdev ids
       [not found] ` <20210315074501.15868-8-lingshan.zhu@intel.com>
@ 2021-03-17  4:07   ` Jason Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2021-03-17  4:07 UTC (permalink / raw)
  To: Zhu Lingshan, mst, lulu, leonro; +Cc: netdev, linux-kernel, kvm, virtualization


在 2021/3/15 下午3:45, Zhu Lingshan 写道:
>   static u32 ifcvf_vdpa_get_device_id(struct vdpa_device *vdpa_dev)
>   {
> -	return VIRTIO_ID_NET;
> +	struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
> +	u32 ret = -EOPNOTSUPP;
> +
> +	if (ifcvf_probed_virtio_net(vf))
> +		ret = VIRTIO_ID_NET;


So the point is to simplify the future extension.

How about simply?

if (device_id>0x1040)
     return devce_id - 0x1040;
else
     return device_id;

Since I don't think you plan to introduce device whose vendor id is not 
1AF4 and the subsys vendor/device id is not interesting to vDPA bus.

Thanks


> +
> +	return ret;
>   }

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-03-17  4:08 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20210315074501.15868-1-lingshan.zhu@intel.com>
     [not found] ` <20210315074501.15868-2-lingshan.zhu@intel.com>
2021-03-16  6:09   ` [PATCH V4 1/7] vDPA/ifcvf: get_vendor_id returns a device specific vendor id Jason Wang
     [not found] ` <20210315074501.15868-3-lingshan.zhu@intel.com>
2021-03-16  6:09   ` [PATCH V4 2/7] vDPA/ifcvf: enable Intel C5000X-PL virtio-net for vDPA Jason Wang
     [not found] ` <20210315074501.15868-4-lingshan.zhu@intel.com>
2021-03-16  6:10   ` [PATCH V4 3/7] vDPA/ifcvf: rename original IFCVF dev ids to N3000 ids Jason Wang
     [not found] ` <20210315074501.15868-5-lingshan.zhu@intel.com>
2021-03-16  6:11   ` [PATCH V4 4/7] vDPA/ifcvf: remove the version number string Jason Wang
     [not found] ` <20210315074501.15868-6-lingshan.zhu@intel.com>
2021-03-17  3:57   ` [PATCH V4 5/7] vDPA/ifcvf: fetch device feature bits when probe Jason Wang
     [not found] ` <20210315074501.15868-7-lingshan.zhu@intel.com>
2021-03-17  3:58   ` [PATCH V4 6/7] vDPA/ifcvf: verify mandatory feature bits for vDPA Jason Wang
     [not found] ` <20210315074501.15868-8-lingshan.zhu@intel.com>
2021-03-17  4:07   ` [PATCH V4 7/7] vDPA/ifcvf: deduce VIRTIO device ID from pdev ids Jason Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).