From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-we0-f182.google.com (mail-we0-f182.google.com [74.125.82.182]) by dpdk.org (Postfix) with ESMTP id 915E6B38C for ; Mon, 1 Sep 2014 16:51:00 +0200 (CEST) Received: by mail-we0-f182.google.com with SMTP id w62so5626567wes.27 for ; Mon, 01 Sep 2014 07:55:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=/Py0zJWqrfSQQFmbZS2QrKGSm0b7mAH8YU+g/9pxX3I=; b=NI4kY/vnILHzmHgDwuFCawqQYamkEgab6lm1590m1u/tZrPdanoWLp1eLLO/knJMCL PiaWHB2HtypUL00qCyjMhYLDoDPT3nAR/gBqNLuKey5smRhPkjJ4SUAPKm691+AMNMGX D8wT/9paIUklZCtDWhYkKiD1fW6jZ7L7r4Q+D8X55TY23+odEzciEHuOLgYzbxTlYWQs nLtC4SiOFZt7AWQZq4snGd7BPnjPwSRDjZuVyckRbLau1wRAXlFVkvfuZtCNW14xE2MT VQ04zhNzJkVCac432Ua8HfM4FLclfxthvBlku93Qdj00KGBBlLpgdyztNt2Tel5rJ+j5 9zzw== X-Gm-Message-State: ALoCoQlMPBqDdZdEjFAM+Wwv2o8E5yTX9PZuNjwaTo6+7u+zTIeXRDAhSjWRZgqITAqTjvUeKKLr X-Received: by 10.194.174.39 with SMTP id bp7mr3126503wjc.131.1409583328250; Mon, 01 Sep 2014 07:55:28 -0700 (PDT) Received: from [10.16.0.146] (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by mx.google.com with ESMTPSA id hy9sm2634847wjb.27.2014.09.01.07.55.26 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 01 Sep 2014 07:55:27 -0700 (PDT) Message-ID: <540488DD.3030304@6wind.com> Date: Mon, 01 Sep 2014 16:55:25 +0200 From: Guillaume Gaudonville User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Stephen Hemminger References: <20140725103627.4ca989b7@haswell.linuxnetplumber.net> In-Reply-To: <20140725103627.4ca989b7@haswell.linuxnetplumber.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH 1/2] igb_uio: fix compability on old kernel X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Sep 2014 14:51:00 -0000 On 07/25/2014 07:36 PM, Stephen Hemminger wrote: > Add more compatibility wrappers, and split out all the wrapper > code to a separate file. Builds on Debian Squeeze (2.6.32) which > is oldest version of kernel current DPDK supports. > > Signed-off-by: Stephen Hemminger > > --- > lib/librte_eal/linuxapp/igb_uio/compat.h | 103 ++++++++++++++++++++++++++++++ > lib/librte_eal/linuxapp/igb_uio/igb_uio.c | 81 ----------------------- > 2 files changed, 104 insertions(+), 80 deletions(-) > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ b/lib/librte_eal/linuxapp/igb_uio/compat.h 2014-07-25 10:29:58.664127988 -0700 > @@ -0,0 +1,103 @@ > +/* > + * Minimal wrappers to allow compiling igb_uio on older kernels. > + */ > + > + > +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) > +#define pci_cfg_access_lock pci_block_user_cfg_access > +#define pci_cfg_access_unlock pci_unblock_user_cfg_access > +#endif > + > +#ifndef PCI_MSIX_ENTRY_SIZE > +#define PCI_MSIX_ENTRY_SIZE 16 > +#define PCI_MSIX_ENTRY_LOWER_ADDR 0 > +#define PCI_MSIX_ENTRY_UPPER_ADDR 4 > +#define PCI_MSIX_ENTRY_DATA 8 > +#define PCI_MSIX_ENTRY_VECTOR_CTRL 12 > +#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 > +#endif > + > +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) > +static int pci_num_vf(struct pci_dev *dev) > +{ > + struct iov { > + int pos; > + int nres; > + u32 cap; > + u16 ctrl; > + u16 total; > + u16 initial; > + u16 nr_virtfn; > + } *iov = (struct iov *)dev->sriov; > + > + if (!dev->is_physfn) > + return 0; > + > + return iov->nr_virtfn; > +} > +#endif > + > + > +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) > + > +/* Check if INTX works to control irq's. > + * Set's INTX_DISABLE flag and reads it back > + */ > +static bool pci_intx_mask_supported(struct pci_dev *pdev) > +{ > + bool mask_supported = false; > + uint16_t orig, new; > + > + pci_block_user_cfg_access(pdev); > + pci_read_config_word(pdev, PCI_COMMAND, &orig); > + pci_write_config_word(pdev, PCI_COMMAND, > + orig ^ PCI_COMMAND_INTX_DISABLE); > + pci_read_config_word(pdev, PCI_COMMAND, &new); > + > + if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) { > + dev_err(&pdev->dev, "Command register changed from " > + "0x%x to 0x%x: driver or hardware bug?\n", orig, new); > + } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) { > + mask_supported = true; > + pci_write_config_word(pdev, PCI_COMMAND, orig); > + } > + pci_unblock_user_cfg_access(pdev); > + > + return mask_supported; > +} > + > +static bool pci_check_and_mask_intx(struct pci_dev *pdev) > +{ > + bool pending; > + uint32_t status; > + > + pci_block_user_cfg_access(pdev); > + pci_read_config_dword(pdev, PCI_COMMAND, &status); > + > + /* interrupt is not ours, goes to out */ > + pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0); > + if (pending) { > + uint16_t old, new; > + > + old = status; > + if (status != 0) > + new = old & (~PCI_COMMAND_INTX_DISABLE); > + else > + new = old | PCI_COMMAND_INTX_DISABLE; > + > + if (old != new) > + pci_write_config_word(pdev, PCI_COMMAND, new); > + } > + pci_unblock_user_cfg_access(pdev); > + > + return pending; > +} > +#endif > + > +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37) > +/* Compatability wrapper for new kernel API for IRQ */ > +#define irq_data irq_desc > +#define irq_get_irq_data(irq) irq_to_desc(irq) > +#define irq_data_get_msi(data) get_irq_desc_msi(data) > +#endif > + irq_to_desc is not exported to modules before kernel 3.4 and commit 3911ff30. On Red Hat 6.5 the module fails to load due to an unknow symbol error. I've seen another post saying that it also fails to insert on kernel 2.6.34. I guess it should not work either on debian squeeze (kernel 2.6.32), did you compile it in built-in? For now, I don't see how we could fix it, since it is not exported we are not allowed to use it in a kernel module. Do you have a way to fix this issue? Thanks, Guillaume > --- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c 2014-07-25 10:29:58.668128002 -0700 > +++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c 2014-07-25 10:29:58.664127988 -0700 > @@ -37,10 +37,7 @@ > #endif > #include > > -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) > -#define pci_cfg_access_lock pci_block_user_cfg_access > -#define pci_cfg_access_unlock pci_unblock_user_cfg_access > -#endif > +#include "compat.h" > > #ifdef RTE_PCI_CONFIG > #define PCI_SYS_FILE_BUF_SIZE 10 > @@ -70,26 +67,6 @@ igbuio_get_uio_pci_dev(struct uio_info * > } > > /* sriov sysfs */ > -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) > -static int pci_num_vf(struct pci_dev *dev) > -{ > - struct iov { > - int pos; > - int nres; > - u32 cap; > - u16 ctrl; > - u16 total; > - u16 initial; > - u16 nr_virtfn; > - } *iov = (struct iov *)dev->sriov; > - > - if (!dev->is_physfn) > - return 0; > - > - return iov->nr_virtfn; > -} > -#endif > - > static ssize_t > show_max_vfs(struct device *dev, struct device_attribute *attr, > char *buf) > @@ -228,62 +205,6 @@ static struct attribute *dev_attrs[] = { > static const struct attribute_group dev_attr_grp = { > .attrs = dev_attrs, > }; > - > -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) > -/* Check if INTX works to control irq's. > - * Set's INTX_DISABLE flag and reads it back > - */ > -static bool pci_intx_mask_supported(struct pci_dev *pdev) > -{ > - bool mask_supported = false; > - uint16_t orig, new; > - > - pci_block_user_cfg_access(pdev); > - pci_read_config_word(pdev, PCI_COMMAND, &orig); > - pci_write_config_word(pdev, PCI_COMMAND, > - orig ^ PCI_COMMAND_INTX_DISABLE); > - pci_read_config_word(pdev, PCI_COMMAND, &new); > - > - if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) { > - dev_err(&pdev->dev, "Command register changed from " > - "0x%x to 0x%x: driver or hardware bug?\n", orig, new); > - } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) { > - mask_supported = true; > - pci_write_config_word(pdev, PCI_COMMAND, orig); > - } > - pci_unblock_user_cfg_access(pdev); > - > - return mask_supported; > -} > - > -static bool pci_check_and_mask_intx(struct pci_dev *pdev) > -{ > - bool pending; > - uint32_t status; > - > - pci_block_user_cfg_access(pdev); > - pci_read_config_dword(pdev, PCI_COMMAND, &status); > - > - /* interrupt is not ours, goes to out */ > - pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0); > - if (pending) { > - uint16_t old, new; > - > - old = status; > - if (status != 0) > - new = old & (~PCI_COMMAND_INTX_DISABLE); > - else > - new = old | PCI_COMMAND_INTX_DISABLE; > - > - if (old != new) > - pci_write_config_word(pdev, PCI_COMMAND, new); > - } > - pci_unblock_user_cfg_access(pdev); > - > - return pending; > -} > -#endif > - > /* > * It masks the msix on/off of generating MSI-X messages. > */