Add a few Linux compatibility shims Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/include/linux/compat_todo.h b/kern/include/linux/compat_todo.h index 096293d..32836ca 100644 --- a/kern/include/linux/compat_todo.h +++ b/kern/include/linux/compat_todo.h
@@ -241,6 +241,13 @@ // XXX t->state = 2 } +static inline void tasklet_kill(struct tasklet_struct *t) +{ + /* This is some hokey shit. The one user of this is trying to kill it + * after it already ran too. This is more of a 'disable' in Linux. */ + atomic_cas_u32(&t->state, 1, 0); +} + static inline void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data) { @@ -305,6 +312,13 @@ return round_jiffies(j); } +static inline unsigned long msecs_to_jiffies(const unsigned int m) +{ + return m; +} + +#define time_after_eq(a, b) ((b) <= (a)) + struct timer_list { spinlock_t lock; bool scheduled; @@ -641,13 +655,14 @@ struct dma_pool *dma_pool_create(const char *name, void *dev, size_t size, size_t align, size_t allocation); - void dma_pool_destroy(struct dma_pool *pool); - void *dma_pool_alloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle); - +void *dma_pool_zalloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle); void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr); +/* This leaks memory, but we don't do driver detach yet. */ +#define dmam_pool_create dma_pool_create + #define pci_pool dma_pool #define pci_pool_create(name, pdev, size, align, allocation) \ dma_pool_create(name, pdev, size, align, allocation) @@ -736,6 +751,7 @@ #define vmalloc_node(...) (0 /* XXX */) /* needed by icm.c: */ #define kmalloc_node(size, flags, node) kmalloc(size, flags) +/* MLX4 icm.c calls this, it fails, and tries something else */ #define alloc_pages_node(nid, gfp_mask, order) 0 struct scatterlist { @@ -1069,6 +1085,7 @@ #define for_each_online_cpu(x) for_each_core(x) #define alloc_percpu_gfp(x, f) percpu_alloc(x, f) +#define alloc_percpu(x) percpu_alloc(x, MEM_WAIT) #define free_percpu(x) percpu_free(x) #define __this_cpu_read(x) PERCPU_VAR(x)
diff --git a/kern/include/linux_compat.h b/kern/include/linux_compat.h index c645057..37af5f9 100644 --- a/kern/include/linux_compat.h +++ b/kern/include/linux_compat.h
@@ -37,6 +37,14 @@ //#define CONFIG_INET 1 // will deal with this manually #define CONFIG_PCI_MSI 1 +#define IS_ENABLED(x) defined(x) + +struct module; +#define __module_get(x) +#define module_put(x) +#define try_module_get(x) true +#define kref_get(p) kref_get(p, 1) + static inline void synchronize_sched(void) { synchronize_rcu(); @@ -160,6 +168,11 @@ #define dma_mapping_error(dev, handle) \ __dma_mapping_error(handle) +static inline void *devm_kzalloc(struct device *dev, size_t amt, int flags) +{ + return kzmalloc(amt, flags); +} + static void *vmalloc(size_t size) { void *vaddr = get_cont_pages(LOG2_UP(nr_pages(size)), MEM_WAIT); @@ -176,6 +189,16 @@ free_cont_pages(vaddr, LOG2_UP(nr_pages(size))); } +/* Linux's helper, adapted to Akaros. Any usage of __flags is likely wrong. */ +#define KMEM_CACHE(__struct, __flags) \ +({ \ + static_assert(__flags == 0); \ + kmem_cache_create(#__struct, sizeof(struct __struct), \ + __alignof__(struct __struct), 0, NULL, NULL, \ + NULL, NULL); \ +}) + + typedef int pci_power_t; typedef int pm_message_t; @@ -267,6 +290,18 @@ #define dev_alert(dev, fmt, ...) \ printk("[dev]: " fmt, ##__VA_ARGS__) +/* Turn it on per-file with #define DEV_DBG */ +#ifdef DEV_DBG + #define dev_dbg(dev, fmt, ...) \ + printk("[dev]: " fmt, ##__VA_ARGS__) +#else + #define dev_dbg(dev, fmt, ...) +#endif + +#define dev_dbg_ratelimited dev_dbg +#define dev_WARN(dev, fmt, ...) \ + warn("[dev]: " fmt, ##__VA_ARGS__) + #ifdef DEBUG #define might_sleep() assert(can_block(&per_cpu_info[core_id()])) @@ -307,6 +342,7 @@ #define MODULE_VERSION(...) #define MODULE_FIRMWARE(...) #define module_param(...) +#define module_param_string(...) #define module_param_named(...) #define MODULE_PARM_DESC(...) #define MODULE_DEVICE_TABLE(...) @@ -316,6 +352,12 @@ #define module_init(...) #define module_exit(...) +/* Feel free to add more. If we get too many of these, we may need to think of + * when we are running them. Right now, they all happen after arch and rcu + * init, and before devtab reset/init. */ +#define arch_initcall(x) init_func_2(x) +#define device_initcall(x) init_func_2(x) + #define is_kdump_kernel() (0) /* from Linux's ethtool.h. We probably won't use any of this code, but at @@ -594,7 +636,7 @@ #define rtnl_unlock() #define ASSERT_RTNL(...) -#define synchronize_irq(x) warn_once("Asked to sync IRQ %d, unsupported", x) +#define synchronize_irq(x) synchronize_rcu() #define HZ 1000 /* Linux has a PCI device id struct. Drivers make tables of their supported @@ -640,6 +682,7 @@ #define PCI_VENDOR_ID_AT 0x1259 #define PCI_VENDOR_ID_LINKSYS 0x1737 #define PCI_VENDOR_ID_GIGABYTE 0x1458 +#define PCI_VENDOR_ID_INTEL 0x8086 /* I'd like to spatch all of the pci methods, but I don't know how to do the * reads. Since we're not doing the reads, then no sense doing the writes. */ @@ -696,6 +739,32 @@ return 0; } +static inline int pci_enable_device_mem(struct pci_device *dev) +{ + return pci_enable_device(dev); +} + +static inline int pci_save_state(struct pci_device *dev) +{ + return 0; +} + +static inline void pci_restore_state(struct pci_device *dev) +{ +} + +static inline void pci_enable_pcie_error_reporting(struct pci_device *dev) +{ +} + +static inline void pci_disable_pcie_error_reporting(struct pci_device *dev) +{ +} + +static inline void pci_wake_from_d3(struct pci_device *dev, bool foo) +{ +} + static inline uint32_t pci_resource_len(struct pci_device *dev, int bir) { return pci_get_membar_sz(dev, bir);
diff --git a/kern/src/dmapool.c b/kern/src/dmapool.c index f714cdd..b6d7f8e 100644 --- a/kern/src/dmapool.c +++ b/kern/src/dmapool.c
@@ -161,6 +161,16 @@ return retval; } +void *dma_pool_zalloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle) +{ + void *ret = dma_pool_alloc(pool, mem_flags, handle); + + if (!ret) + return NULL; + memset(ret, 0, pool->size); + return ret; +} + void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr) { /* TODO */