summaryrefslogtreecommitdiffstats
path: root/kernel/up.c
blob: 509403e3fbc6b5bffbef9ecaa47cad6c68c03c3f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef _NET_INET_DATALINK_H_
#define _NET_INET_DATALINK_H_

struct datalink_proto {
        unsigned char   type[8];

	struct llc_sap   *sap;

        unsigned short  header_length;

        int     (*rcvfunc)(struct sk_buff *, struct net_device *,
                                struct packet_type *, struct net_device *);
	int     (*request)(struct datalink_proto *, struct sk_buff *,
                                        unsigned char *);
	struct list_head node;
};

#endif
/* * Uniprocessor-only support functions. The counterpart to kernel/smp.c */ #include <linux/interrupt.h> #include <linux/kernel.h> #include <linux/export.h> #include <linux/smp.h> int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int wait) { unsigned long flags; WARN_ON(cpu != 0); local_irq_save(flags); func(info); local_irq_restore(flags); return 0; } EXPORT_SYMBOL(smp_call_function_single); void __smp_call_function_single(int cpu, struct call_single_data *csd, int wait) { unsigned long flags; local_irq_save(flags); csd->func(csd->info); local_irq_restore(flags); } EXPORT_SYMBOL(__smp_call_function_single); int on_each_cpu(smp_call_func_t func, void *info, int wait) { unsigned long flags; local_irq_save(flags); func(info); local_irq_restore(flags); return 0; } EXPORT_SYMBOL(on_each_cpu); /* * Note we still need to test the mask even for UP * because we actually can get an empty mask from * code that on SMP might call us without the local * CPU in the mask. */ void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func, void *info, bool wait) { unsigned long flags; if (cpumask_test_cpu(0, mask)) { local_irq_save(flags); func(info); local_irq_restore(flags); } } EXPORT_SYMBOL(on_each_cpu_mask); /* * Preemption is disabled here to make sure the cond_func is called under the * same condtions in UP and SMP. */ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), smp_call_func_t func, void *info, bool wait, gfp_t gfp_flags) { unsigned long flags; preempt_disable(); if (cond_func(0, info)) { local_irq_save(flags); func(info); local_irq_restore(flags); } preempt_enable(); } EXPORT_SYMBOL(on_each_cpu_cond);