mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 22:52:35 +02:00
Merge branch 'linux-linaro-lsk' into linux-linaro-lsk-android
This commit is contained in:
commit
7bbbbe2e4b
|
|
@ -123,6 +123,16 @@ Transmission process is similar to capture as shown below.
|
|||
[shutdown] close() --------> destruction of the transmission socket and
|
||||
deallocation of all associated resources.
|
||||
|
||||
Socket creation and destruction is also straight forward, and is done
|
||||
the same way as in capturing described in the previous paragraph:
|
||||
|
||||
int fd = socket(PF_PACKET, mode, 0);
|
||||
|
||||
The protocol can optionally be 0 in case we only want to transmit
|
||||
via this socket, which avoids an expensive call to packet_rcv().
|
||||
In this case, you also need to bind(2) the TX_RING with sll_protocol = 0
|
||||
set. Otherwise, htons(ETH_P_ALL) or any other protocol, for example.
|
||||
|
||||
Binding the socket to your network interface is mandatory (with zero copy) to
|
||||
know the header size of frames used in the circular buffer.
|
||||
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 26
|
||||
SUBLEVEL = 27
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -545,7 +545,7 @@ mdma0: mdma@10800000 {
|
|||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x10800000 0x1000>;
|
||||
interrupts = <0 33 0>;
|
||||
clocks = <&clock 271>;
|
||||
clocks = <&clock 346>;
|
||||
clock-names = "apb_pclk";
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
|
|
|
|||
|
|
@ -167,6 +167,13 @@ clcd@1f0000 {
|
|||
use_dma = <0>;
|
||||
framebuffer = <0x18000000 0x00180000>;
|
||||
};
|
||||
|
||||
virtio_block@0130000 {
|
||||
compatible = "virtio,mmio";
|
||||
reg = <0x130000 0x200>;
|
||||
interrupts = <42>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
v2m_fixed_3v3: fixedregulator@0 {
|
||||
|
|
|
|||
|
|
@ -35,7 +35,13 @@
|
|||
#include <asm/tls.h>
|
||||
#include <asm/system_misc.h>
|
||||
|
||||
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
|
||||
static const char *handler[]= {
|
||||
"prefetch abort",
|
||||
"data abort",
|
||||
"address exception",
|
||||
"interrupt",
|
||||
"undefined instruction",
|
||||
};
|
||||
|
||||
void *vectors_page;
|
||||
|
||||
|
|
|
|||
|
|
@ -96,11 +96,12 @@ static struct irqaction footbridge_timer_irq = {
|
|||
void __init footbridge_timer_init(void)
|
||||
{
|
||||
struct clock_event_device *ce = &ckevt_dc21285;
|
||||
unsigned rate = DIV_ROUND_CLOSEST(mem_fclk_21285, 16);
|
||||
|
||||
clocksource_register_hz(&cksrc_dc21285, (mem_fclk_21285 + 8) / 16);
|
||||
clocksource_register_hz(&cksrc_dc21285, rate);
|
||||
|
||||
setup_irq(ce->irq, &footbridge_timer_irq);
|
||||
|
||||
ce->cpumask = cpumask_of(smp_processor_id());
|
||||
clockevents_config_and_register(ce, mem_fclk_21285, 0x4, 0xffffff);
|
||||
clockevents_config_and_register(ce, rate, 0x4, 0xffffff);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -437,7 +437,7 @@ static struct platform_device lcdc0_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &lcdc0_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -534,7 +534,7 @@ static struct platform_device hdmi_lcdc_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &hdmi_lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -332,7 +332,7 @@ static struct platform_device lcdc_device = {
|
|||
.resource = lcdc_resources,
|
||||
.dev = {
|
||||
.platform_data = &lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -421,7 +421,7 @@ static struct platform_device lcdc_device = {
|
|||
.resource = lcdc_resources,
|
||||
.dev = {
|
||||
.platform_data = &lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -497,7 +497,7 @@ static struct platform_device hdmi_lcdc_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &hdmi_lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -125,42 +125,38 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma
|
|||
void mark_rodata_ro(void);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PA8X00
|
||||
/* Only pa8800, pa8900 needs this */
|
||||
|
||||
#include <asm/kmap_types.h>
|
||||
|
||||
#define ARCH_HAS_KMAP
|
||||
|
||||
void kunmap_parisc(void *addr);
|
||||
|
||||
static inline void *kmap(struct page *page)
|
||||
{
|
||||
might_sleep();
|
||||
flush_dcache_page(page);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
static inline void kunmap(struct page *page)
|
||||
{
|
||||
kunmap_parisc(page_address(page));
|
||||
flush_kernel_dcache_page_addr(page_address(page));
|
||||
}
|
||||
|
||||
static inline void *kmap_atomic(struct page *page)
|
||||
{
|
||||
pagefault_disable();
|
||||
flush_dcache_page(page);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
static inline void __kunmap_atomic(void *addr)
|
||||
{
|
||||
kunmap_parisc(addr);
|
||||
flush_kernel_dcache_page_addr(addr);
|
||||
pagefault_enable();
|
||||
}
|
||||
|
||||
#define kmap_atomic_prot(page, prot) kmap_atomic(page)
|
||||
#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn))
|
||||
#define kmap_atomic_to_page(ptr) virt_to_page(ptr)
|
||||
#endif
|
||||
|
||||
#endif /* _PARISC_CACHEFLUSH_H */
|
||||
|
||||
|
|
|
|||
|
|
@ -28,9 +28,8 @@ struct page;
|
|||
|
||||
void clear_page_asm(void *page);
|
||||
void copy_page_asm(void *to, void *from);
|
||||
void clear_user_page(void *vto, unsigned long vaddr, struct page *pg);
|
||||
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
struct page *pg);
|
||||
#define clear_user_page(vto, vaddr, page) clear_page_asm(vto)
|
||||
#define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom)
|
||||
|
||||
/* #define CONFIG_PARISC_TMPALIAS */
|
||||
|
||||
|
|
|
|||
|
|
@ -388,41 +388,6 @@ void flush_kernel_dcache_page_addr(void *addr)
|
|||
}
|
||||
EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
|
||||
|
||||
void clear_user_page(void *vto, unsigned long vaddr, struct page *page)
|
||||
{
|
||||
clear_page_asm(vto);
|
||||
if (!parisc_requires_coherency())
|
||||
flush_kernel_dcache_page_asm(vto);
|
||||
}
|
||||
EXPORT_SYMBOL(clear_user_page);
|
||||
|
||||
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
struct page *pg)
|
||||
{
|
||||
/* Copy using kernel mapping. No coherency is needed
|
||||
(all in kmap/kunmap) on machines that don't support
|
||||
non-equivalent aliasing. However, the `from' page
|
||||
needs to be flushed before it can be accessed through
|
||||
the kernel mapping. */
|
||||
preempt_disable();
|
||||
flush_dcache_page_asm(__pa(vfrom), vaddr);
|
||||
preempt_enable();
|
||||
copy_page_asm(vto, vfrom);
|
||||
if (!parisc_requires_coherency())
|
||||
flush_kernel_dcache_page_asm(vto);
|
||||
}
|
||||
EXPORT_SYMBOL(copy_user_page);
|
||||
|
||||
#ifdef CONFIG_PA8X00
|
||||
|
||||
void kunmap_parisc(void *addr)
|
||||
{
|
||||
if (parisc_requires_coherency())
|
||||
flush_kernel_dcache_page_addr(addr);
|
||||
}
|
||||
EXPORT_SYMBOL(kunmap_parisc);
|
||||
#endif
|
||||
|
||||
void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
|||
|
|
@ -295,12 +295,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk)
|
|||
/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception
|
||||
is pending. Clear the x87 state here by setting it to fixed
|
||||
values. "m" is a random variable that should be in L1 */
|
||||
alternative_input(
|
||||
ASM_NOP8 ASM_NOP2,
|
||||
"emms\n\t" /* clear stack tags */
|
||||
"fildl %P[addr]", /* set F?P to defined value */
|
||||
X86_FEATURE_FXSAVE_LEAK,
|
||||
[addr] "m" (tsk->thread.fpu.has_fpu));
|
||||
if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) {
|
||||
asm volatile(
|
||||
"fnclex\n\t"
|
||||
"emms\n\t"
|
||||
"fildl %P[addr]" /* set F?P to defined value */
|
||||
: : [addr] "m" (tsk->thread.fpu.has_fpu));
|
||||
}
|
||||
|
||||
return fpu_restore_checking(&tsk->thread.fpu);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
|
|||
MODULE_DESCRIPTION("ACPI Battery Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int battery_bix_broken_package;
|
||||
static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
|
@ -443,7 +444,12 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
|
|||
ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name));
|
||||
return -ENODEV;
|
||||
}
|
||||
if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
|
||||
|
||||
if (battery_bix_broken_package)
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
extended_info_offsets + 1,
|
||||
ARRAY_SIZE(extended_info_offsets) - 1);
|
||||
else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
extended_info_offsets,
|
||||
ARRAY_SIZE(extended_info_offsets));
|
||||
|
|
@ -1064,6 +1070,17 @@ static int battery_notify(struct notifier_block *nb,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id bat_dmi_table[] = {
|
||||
{
|
||||
.ident = "NEC LZ750/LS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
static int acpi_battery_add(struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
|
|
@ -1174,6 +1191,8 @@ static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
|
|||
if (!acpi_battery_dir)
|
||||
return;
|
||||
#endif
|
||||
if (dmi_check_system(bat_dmi_table))
|
||||
battery_bix_broken_package = 1;
|
||||
if (acpi_bus_register_driver(&acpi_battery_driver) < 0) {
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_unlock_battery_dir(acpi_battery_dir);
|
||||
|
|
|
|||
|
|
@ -427,6 +427,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
.driver_data = board_ahci_yes_fbs }, /* 88se9128 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9125 */
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178,
|
||||
PCI_VENDOR_ID_MARVELL_EXT, 0x9170),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9170 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
|
||||
|
|
|
|||
|
|
@ -27,15 +27,18 @@ static char *tpm_device_name = "TPM";
|
|||
static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context,
|
||||
void **return_value)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
|
||||
if (strstr(buffer.pointer, context) != NULL) {
|
||||
*return_value = handle;
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer))) {
|
||||
if (strstr(buffer.pointer, context) != NULL) {
|
||||
*return_value = handle;
|
||||
status = AE_CTRL_TERMINATE;
|
||||
}
|
||||
kfree(buffer.pointer);
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
return AE_OK;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static inline void ppi_assign_params(union acpi_object params[4],
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ static unsigned int _get_table_val(const struct clk_div_table *table,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int _get_val(struct clk_divider *divider, u8 div)
|
||||
static unsigned int _get_val(struct clk_divider *divider, unsigned int div)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_ONE_BASED)
|
||||
return div;
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
#define SRC_TOP1 0xc214
|
||||
#define SRC_CAM 0xc220
|
||||
#define SRC_TV 0xc224
|
||||
#define SRC_MFC 0xcc28
|
||||
#define SRC_MFC 0xc228
|
||||
#define SRC_G3D 0xc22c
|
||||
#define E4210_SRC_IMAGE 0xc230
|
||||
#define SRC_LCD0 0xc234
|
||||
|
|
|
|||
|
|
@ -325,8 +325,8 @@ struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
|
|||
GATE(smmu_gscl2, "smmu_gscl2", "aclk266", GATE_IP_GSCL, 9, 0, 0),
|
||||
GATE(smmu_gscl3, "smmu_gscl3", "aclk266", GATE_IP_GSCL, 10, 0, 0),
|
||||
GATE(mfc, "mfc", "aclk333", GATE_IP_MFC, 0, 0, 0),
|
||||
GATE(smmu_mfcl, "smmu_mfcl", "aclk333", GATE_IP_MFC, 1, 0, 0),
|
||||
GATE(smmu_mfcr, "smmu_mfcr", "aclk333", GATE_IP_MFC, 2, 0, 0),
|
||||
GATE(smmu_mfcl, "smmu_mfcl", "aclk333", GATE_IP_MFC, 2, 0, 0),
|
||||
GATE(smmu_mfcr, "smmu_mfcr", "aclk333", GATE_IP_MFC, 1, 0, 0),
|
||||
GATE(rotator, "rotator", "aclk266", GATE_IP_GEN, 1, 0, 0),
|
||||
GATE(jpeg, "jpeg", "aclk166", GATE_IP_GEN, 2, 0, 0),
|
||||
GATE(mdma1, "mdma1", "aclk266", GATE_IP_GEN, 4, 0, 0),
|
||||
|
|
@ -377,7 +377,8 @@ struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
|
|||
GATE(hsi2c2, "hsi2c2", "aclk66", GATE_IP_PERIC, 30, 0, 0),
|
||||
GATE(hsi2c3, "hsi2c3", "aclk66", GATE_IP_PERIC, 31, 0, 0),
|
||||
GATE(chipid, "chipid", "aclk66", GATE_IP_PERIS, 0, 0, 0),
|
||||
GATE(sysreg, "sysreg", "aclk66", GATE_IP_PERIS, 1, 0, 0),
|
||||
GATE(sysreg, "sysreg", "aclk66",
|
||||
GATE_IP_PERIS, 1, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(pmu, "pmu", "aclk66", GATE_IP_PERIS, 2, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(tzpc0, "tzpc0", "aclk66", GATE_IP_PERIS, 6, 0, 0),
|
||||
GATE(tzpc1, "tzpc1", "aclk66", GATE_IP_PERIS, 7, 0, 0),
|
||||
|
|
|
|||
|
|
@ -301,7 +301,7 @@ static void em_sti_register_clockevent(struct em_sti_priv *p)
|
|||
ced->name = dev_name(&p->pdev->dev);
|
||||
ced->features = CLOCK_EVT_FEAT_ONESHOT;
|
||||
ced->rating = 200;
|
||||
ced->cpumask = cpumask_of(0);
|
||||
ced->cpumask = cpu_possible_mask;
|
||||
ced->set_next_event = em_sti_clock_event_next;
|
||||
ced->set_mode = em_sti_clock_event_mode;
|
||||
|
||||
|
|
|
|||
|
|
@ -516,7 +516,8 @@ static void intel_pstate_timer_func(unsigned long __data)
|
|||
}
|
||||
|
||||
#define ICPU(model, policy) \
|
||||
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&policy }
|
||||
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_APERFMPERF,\
|
||||
(unsigned long)&policy }
|
||||
|
||||
static const struct x86_cpu_id intel_pstate_cpu_ids[] = {
|
||||
ICPU(0x2a, default_policy),
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (devm_request_irq(&pdev->dev, irq->start,
|
||||
gpio_rcar_irq_handler, 0, name, p)) {
|
||||
gpio_rcar_irq_handler, IRQF_SHARED, name, p)) {
|
||||
dev_err(&pdev->dev, "failed to request IRQ\n");
|
||||
ret = -ENOENT;
|
||||
goto err1;
|
||||
|
|
|
|||
|
|
@ -1295,7 +1295,11 @@ init_jump(struct nvbios_init *init)
|
|||
u16 offset = nv_ro16(bios, init->offset + 1);
|
||||
|
||||
trace("JUMP\t0x%04x\n", offset);
|
||||
init->offset = offset;
|
||||
|
||||
if (init_exec(init))
|
||||
init->offset = offset;
|
||||
else
|
||||
init->offset += 3;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@ static struct hid_ll_driver logi_dj_ll_driver;
|
|||
static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf,
|
||||
size_t count,
|
||||
unsigned char report_type);
|
||||
static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
|
||||
|
||||
static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
|
||||
struct dj_report *dj_report)
|
||||
|
|
@ -232,6 +233,7 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
|
|||
if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
|
||||
SPFUNCTION_DEVICE_LIST_EMPTY) {
|
||||
dbg_hid("%s: device list is empty\n", __func__);
|
||||
djrcv_dev->querying_devices = false;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -242,6 +244,12 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
|
|||
return;
|
||||
}
|
||||
|
||||
if (djrcv_dev->paired_dj_devices[dj_report->device_index]) {
|
||||
/* The device is already known. No need to reallocate it. */
|
||||
dbg_hid("%s: device is already known\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
dj_hiddev = hid_allocate_device();
|
||||
if (IS_ERR(dj_hiddev)) {
|
||||
dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n",
|
||||
|
|
@ -305,6 +313,7 @@ static void delayedwork_callback(struct work_struct *work)
|
|||
struct dj_report dj_report;
|
||||
unsigned long flags;
|
||||
int count;
|
||||
int retval;
|
||||
|
||||
dbg_hid("%s\n", __func__);
|
||||
|
||||
|
|
@ -337,6 +346,25 @@ static void delayedwork_callback(struct work_struct *work)
|
|||
logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report);
|
||||
break;
|
||||
default:
|
||||
/* A normal report (i. e. not belonging to a pair/unpair notification)
|
||||
* arriving here, means that the report arrived but we did not have a
|
||||
* paired dj_device associated to the report's device_index, this
|
||||
* means that the original "device paired" notification corresponding
|
||||
* to this dj_device never arrived to this driver. The reason is that
|
||||
* hid-core discards all packets coming from a device while probe() is
|
||||
* executing. */
|
||||
if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) {
|
||||
/* ok, we don't know the device, just re-ask the
|
||||
* receiver for the list of connected devices. */
|
||||
retval = logi_dj_recv_query_paired_devices(djrcv_dev);
|
||||
if (!retval) {
|
||||
/* everything went fine, so just leave */
|
||||
break;
|
||||
}
|
||||
dev_err(&djrcv_dev->hdev->dev,
|
||||
"%s:logi_dj_recv_query_paired_devices "
|
||||
"error:%d\n", __func__, retval);
|
||||
}
|
||||
dbg_hid("%s: unexpected report type\n", __func__);
|
||||
}
|
||||
}
|
||||
|
|
@ -367,6 +395,12 @@ static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
|
|||
if (!djdev) {
|
||||
dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
|
||||
" is NULL, index %d\n", dj_report->device_index);
|
||||
kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
|
||||
|
||||
if (schedule_work(&djrcv_dev->work) == 0) {
|
||||
dbg_hid("%s: did not schedule the work item, was already "
|
||||
"queued\n", __func__);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -397,6 +431,12 @@ static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
|
|||
if (dj_device == NULL) {
|
||||
dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
|
||||
" is NULL, index %d\n", dj_report->device_index);
|
||||
kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
|
||||
|
||||
if (schedule_work(&djrcv_dev->work) == 0) {
|
||||
dbg_hid("%s: did not schedule the work item, was already "
|
||||
"queued\n", __func__);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -444,6 +484,10 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
|
|||
struct dj_report *dj_report;
|
||||
int retval;
|
||||
|
||||
/* no need to protect djrcv_dev->querying_devices */
|
||||
if (djrcv_dev->querying_devices)
|
||||
return 0;
|
||||
|
||||
dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
|
||||
if (!dj_report)
|
||||
return -ENOMEM;
|
||||
|
|
@ -455,6 +499,7 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
|
|||
return retval;
|
||||
}
|
||||
|
||||
|
||||
static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
|
||||
unsigned timeout)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ struct dj_receiver_dev {
|
|||
struct work_struct work;
|
||||
struct kfifo notif_fifo;
|
||||
spinlock_t lock;
|
||||
bool querying_devices;
|
||||
};
|
||||
|
||||
struct dj_device {
|
||||
|
|
|
|||
|
|
@ -248,8 +248,8 @@ static int irqc_probe(struct platform_device *pdev)
|
|||
|
||||
return 0;
|
||||
err3:
|
||||
for (; k >= 0; k--)
|
||||
free_irq(p->irq[k - 1].requested_irq, &p->irq[k - 1]);
|
||||
while (--k >= 0)
|
||||
free_irq(p->irq[k].requested_irq, &p->irq[k]);
|
||||
|
||||
irq_domain_remove(p->irq_domain);
|
||||
err2:
|
||||
|
|
|
|||
|
|
@ -1195,8 +1195,14 @@ static void rtsx_pci_remove(struct pci_dev *pcidev)
|
|||
|
||||
pcr->remove_pci = true;
|
||||
|
||||
cancel_delayed_work(&pcr->carddet_work);
|
||||
cancel_delayed_work(&pcr->idle_work);
|
||||
/* Disable interrupts at the pcr level */
|
||||
spin_lock_irq(&pcr->lock);
|
||||
rtsx_pci_writel(pcr, RTSX_BIER, 0);
|
||||
pcr->bier = 0;
|
||||
spin_unlock_irq(&pcr->lock);
|
||||
|
||||
cancel_delayed_work_sync(&pcr->carddet_work);
|
||||
cancel_delayed_work_sync(&pcr->idle_work);
|
||||
|
||||
mfd_remove_devices(&pcidev->dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -16297,6 +16297,9 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
|
|||
/* Clear this out for sanity. */
|
||||
tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
|
||||
|
||||
/* Clear TG3PCI_REG_BASE_ADDR to prevent hangs. */
|
||||
tw32(TG3PCI_REG_BASE_ADDR, 0);
|
||||
|
||||
pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
|
||||
&pci_state_reg);
|
||||
if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 &&
|
||||
|
|
|
|||
|
|
@ -371,6 +371,8 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|||
else
|
||||
bdp = fec_enet_get_nextdesc(bdp, fep->bufdesc_ex);
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
|
||||
fep->cur_tx = bdp;
|
||||
|
||||
if (fep->cur_tx == fep->dirty_tx)
|
||||
|
|
@ -379,8 +381,6 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|||
/* Trigger transmission start */
|
||||
writel(0, fep->hwp + FEC_X_DES_ACTIVE);
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3023,7 +3023,7 @@ static struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
|
|||
|
||||
dev->hw_features = NETIF_F_SG | NETIF_F_TSO |
|
||||
NETIF_F_IP_CSUM | NETIF_F_HW_VLAN_CTAG_TX;
|
||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO |
|
||||
dev->features = NETIF_F_SG | NETIF_F_TSO |
|
||||
NETIF_F_HIGHDMA | NETIF_F_IP_CSUM |
|
||||
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXCSUM;
|
||||
|
|
|
|||
|
|
@ -2019,7 +2019,6 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
ndev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO
|
||||
| NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXCSUM
|
||||
/*| NETIF_F_FRAGLIST */
|
||||
;
|
||||
ndev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
|
||||
NETIF_F_TSO | NETIF_F_HW_VLAN_CTAG_TX;
|
||||
|
|
|
|||
|
|
@ -1016,7 +1016,7 @@ static int temac_of_probe(struct platform_device *op)
|
|||
dev_set_drvdata(&op->dev, ndev);
|
||||
SET_NETDEV_DEV(ndev, &op->dev);
|
||||
ndev->flags &= ~IFF_MULTICAST; /* clear multicast */
|
||||
ndev->features = NETIF_F_SG | NETIF_F_FRAGLIST;
|
||||
ndev->features = NETIF_F_SG;
|
||||
ndev->netdev_ops = &temac_netdev_ops;
|
||||
ndev->ethtool_ops = &temac_ethtool_ops;
|
||||
#if 0
|
||||
|
|
|
|||
|
|
@ -1488,7 +1488,7 @@ static int axienet_of_probe(struct platform_device *op)
|
|||
|
||||
SET_NETDEV_DEV(ndev, &op->dev);
|
||||
ndev->flags &= ~IFF_MULTICAST; /* clear multicast */
|
||||
ndev->features = NETIF_F_SG | NETIF_F_FRAGLIST;
|
||||
ndev->features = NETIF_F_SG;
|
||||
ndev->netdev_ops = &axienet_netdev_ops;
|
||||
ndev->ethtool_ops = &axienet_ethtool_ops;
|
||||
|
||||
|
|
|
|||
|
|
@ -571,6 +571,8 @@ static int hdlcdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
case HDLCDRVCTL_CALIBRATE:
|
||||
if(!capable(CAP_SYS_RAWIO))
|
||||
return -EPERM;
|
||||
if (bi.data.calibrate > INT_MAX / s->par.bitrate)
|
||||
return -EINVAL;
|
||||
s->hdlctx.calibrate = bi.data.calibrate * s->par.bitrate / 16;
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -1058,6 +1058,7 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
break;
|
||||
|
||||
case SIOCYAMGCFG:
|
||||
memset(&yi, 0, sizeof(yi));
|
||||
yi.cfg.mask = 0xffffffff;
|
||||
yi.cfg.iobase = yp->iobase;
|
||||
yi.cfg.irq = yp->irq;
|
||||
|
|
|
|||
|
|
@ -328,7 +328,6 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
|
|||
return -EINVAL;
|
||||
|
||||
nvdev->start_remove = true;
|
||||
cancel_delayed_work_sync(&ndevctx->dwork);
|
||||
cancel_work_sync(&ndevctx->work);
|
||||
netif_tx_disable(ndev);
|
||||
rndis_filter_device_remove(hdev);
|
||||
|
|
|
|||
|
|
@ -797,11 +797,10 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
|
|||
const struct sk_buff *skb,
|
||||
const struct iovec *iv, int len)
|
||||
{
|
||||
struct macvlan_dev *vlan;
|
||||
int ret;
|
||||
int vnet_hdr_len = 0;
|
||||
int vlan_offset = 0;
|
||||
int copied;
|
||||
int copied, total;
|
||||
|
||||
if (q->flags & IFF_VNET_HDR) {
|
||||
struct virtio_net_hdr vnet_hdr;
|
||||
|
|
@ -816,7 +815,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
|
|||
if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))
|
||||
return -EFAULT;
|
||||
}
|
||||
copied = vnet_hdr_len;
|
||||
total = copied = vnet_hdr_len;
|
||||
total += skb->len;
|
||||
|
||||
if (!vlan_tx_tag_present(skb))
|
||||
len = min_t(int, skb->len, len);
|
||||
|
|
@ -831,6 +831,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
|
|||
|
||||
vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
|
||||
len = min_t(int, skb->len + VLAN_HLEN, len);
|
||||
total += VLAN_HLEN;
|
||||
|
||||
copy = min_t(int, vlan_offset, len);
|
||||
ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
|
||||
|
|
@ -848,16 +849,9 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
|
|||
}
|
||||
|
||||
ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
|
||||
copied += len;
|
||||
|
||||
done:
|
||||
rcu_read_lock_bh();
|
||||
vlan = rcu_dereference_bh(q->vlan);
|
||||
if (vlan)
|
||||
macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0);
|
||||
rcu_read_unlock_bh();
|
||||
|
||||
return ret ? ret : copied;
|
||||
return ret ? ret : total;
|
||||
}
|
||||
|
||||
static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
|
||||
|
|
@ -909,7 +903,9 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
|
|||
}
|
||||
|
||||
ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
|
||||
ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
|
||||
ret = min_t(ssize_t, ret, len);
|
||||
if (ret > 0)
|
||||
iocb->ki_pos = ret;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1412,6 +1412,8 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
|
|||
ret = tun_do_read(tun, tfile, iocb, iv, len,
|
||||
file->f_flags & O_NONBLOCK);
|
||||
ret = min_t(ssize_t, ret, len);
|
||||
if (ret > 0)
|
||||
iocb->ki_pos = ret;
|
||||
out:
|
||||
tun_put(tun);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -294,26 +294,61 @@ static struct sk_buff *page_to_skb(struct receive_queue *rq,
|
|||
return skb;
|
||||
}
|
||||
|
||||
static int receive_mergeable(struct receive_queue *rq, struct sk_buff *skb)
|
||||
static struct sk_buff *receive_small(void *buf, unsigned int len)
|
||||
{
|
||||
struct skb_vnet_hdr *hdr = skb_vnet_hdr(skb);
|
||||
struct page *page;
|
||||
int num_buf, i, len;
|
||||
struct sk_buff * skb = buf;
|
||||
|
||||
len -= sizeof(struct virtio_net_hdr);
|
||||
skb_trim(skb, len);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *receive_big(struct net_device *dev,
|
||||
struct receive_queue *rq,
|
||||
void *buf)
|
||||
{
|
||||
struct page *page = buf;
|
||||
struct sk_buff *skb = page_to_skb(rq, page, 0);
|
||||
|
||||
if (unlikely(!skb))
|
||||
goto err;
|
||||
|
||||
return skb;
|
||||
|
||||
err:
|
||||
dev->stats.rx_dropped++;
|
||||
give_pages(rq, page);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct sk_buff *receive_mergeable(struct net_device *dev,
|
||||
struct receive_queue *rq,
|
||||
void *buf,
|
||||
unsigned int len)
|
||||
{
|
||||
struct skb_vnet_hdr *hdr = page_address(buf);
|
||||
int num_buf = hdr->mhdr.num_buffers;
|
||||
struct page *page = buf;
|
||||
struct sk_buff *skb = page_to_skb(rq, page, len);
|
||||
int i;
|
||||
|
||||
if (unlikely(!skb))
|
||||
goto err_skb;
|
||||
|
||||
num_buf = hdr->mhdr.num_buffers;
|
||||
while (--num_buf) {
|
||||
i = skb_shinfo(skb)->nr_frags;
|
||||
if (i >= MAX_SKB_FRAGS) {
|
||||
pr_debug("%s: packet too long\n", skb->dev->name);
|
||||
skb->dev->stats.rx_length_errors++;
|
||||
return -EINVAL;
|
||||
goto err_frags;
|
||||
}
|
||||
page = virtqueue_get_buf(rq->vq, &len);
|
||||
if (!page) {
|
||||
pr_debug("%s: rx error: %d buffers missing\n",
|
||||
skb->dev->name, hdr->mhdr.num_buffers);
|
||||
skb->dev->stats.rx_length_errors++;
|
||||
return -EINVAL;
|
||||
pr_debug("%s: rx error: %d buffers %d missing\n",
|
||||
dev->name, hdr->mhdr.num_buffers, num_buf);
|
||||
dev->stats.rx_length_errors++;
|
||||
goto err_buf;
|
||||
}
|
||||
|
||||
if (len > PAGE_SIZE)
|
||||
|
|
@ -323,7 +358,26 @@ static int receive_mergeable(struct receive_queue *rq, struct sk_buff *skb)
|
|||
|
||||
--rq->num;
|
||||
}
|
||||
return 0;
|
||||
return skb;
|
||||
err_skb:
|
||||
give_pages(rq, page);
|
||||
while (--num_buf) {
|
||||
err_frags:
|
||||
buf = virtqueue_get_buf(rq->vq, &len);
|
||||
if (unlikely(!buf)) {
|
||||
pr_debug("%s: rx error: %d buffers missing\n",
|
||||
dev->name, num_buf);
|
||||
dev->stats.rx_length_errors++;
|
||||
break;
|
||||
}
|
||||
page = buf;
|
||||
give_pages(rq, page);
|
||||
--rq->num;
|
||||
}
|
||||
err_buf:
|
||||
dev->stats.rx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
|
||||
|
|
@ -332,7 +386,6 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
|
|||
struct net_device *dev = vi->dev;
|
||||
struct virtnet_stats *stats = this_cpu_ptr(vi->stats);
|
||||
struct sk_buff *skb;
|
||||
struct page *page;
|
||||
struct skb_vnet_hdr *hdr;
|
||||
|
||||
if (unlikely(len < sizeof(struct virtio_net_hdr) + ETH_HLEN)) {
|
||||
|
|
@ -344,25 +397,15 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
|
|||
dev_kfree_skb(buf);
|
||||
return;
|
||||
}
|
||||
if (vi->mergeable_rx_bufs)
|
||||
skb = receive_mergeable(dev, rq, buf, len);
|
||||
else if (vi->big_packets)
|
||||
skb = receive_big(dev, rq, buf);
|
||||
else
|
||||
skb = receive_small(buf, len);
|
||||
|
||||
if (!vi->mergeable_rx_bufs && !vi->big_packets) {
|
||||
skb = buf;
|
||||
len -= sizeof(struct virtio_net_hdr);
|
||||
skb_trim(skb, len);
|
||||
} else {
|
||||
page = buf;
|
||||
skb = page_to_skb(rq, page, len);
|
||||
if (unlikely(!skb)) {
|
||||
dev->stats.rx_dropped++;
|
||||
give_pages(rq, page);
|
||||
return;
|
||||
}
|
||||
if (vi->mergeable_rx_bufs)
|
||||
if (receive_mergeable(rq, skb)) {
|
||||
dev_kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (unlikely(!skb))
|
||||
return;
|
||||
|
||||
hdr = skb_vnet_hdr(skb);
|
||||
|
||||
|
|
@ -1285,6 +1328,11 @@ static void virtnet_config_changed(struct virtio_device *vdev)
|
|||
|
||||
static void virtnet_free_queues(struct virtnet_info *vi)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < vi->max_queue_pairs; i++)
|
||||
netif_napi_del(&vi->rq[i].napi);
|
||||
|
||||
kfree(vi->rq);
|
||||
kfree(vi->sq);
|
||||
}
|
||||
|
|
@ -1697,16 +1745,17 @@ static int virtnet_restore(struct virtio_device *vdev)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
if (netif_running(vi->dev))
|
||||
if (netif_running(vi->dev)) {
|
||||
for (i = 0; i < vi->curr_queue_pairs; i++)
|
||||
if (!try_fill_recv(&vi->rq[i], GFP_KERNEL))
|
||||
schedule_delayed_work(&vi->refill, 0);
|
||||
|
||||
for (i = 0; i < vi->max_queue_pairs; i++)
|
||||
virtnet_napi_enable(&vi->rq[i]);
|
||||
}
|
||||
|
||||
netif_device_attach(vi->dev);
|
||||
|
||||
for (i = 0; i < vi->curr_queue_pairs; i++)
|
||||
if (!try_fill_recv(&vi->rq[i], GFP_KERNEL))
|
||||
schedule_delayed_work(&vi->refill, 0);
|
||||
|
||||
mutex_lock(&vi->config_lock);
|
||||
vi->config_enable = true;
|
||||
mutex_unlock(&vi->config_lock);
|
||||
|
|
|
|||
|
|
@ -2634,13 +2634,16 @@ static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer)
|
|||
}
|
||||
|
||||
if (scsi_report_opcode(sdev, buffer, SD_BUF_SIZE, INQUIRY) < 0) {
|
||||
/* too large values might cause issues with arcmsr */
|
||||
int vpd_buf_len = 64;
|
||||
|
||||
sdev->no_report_opcodes = 1;
|
||||
|
||||
/* Disable WRITE SAME if REPORT SUPPORTED OPERATION
|
||||
* CODES is unsupported and the device has an ATA
|
||||
* Information VPD page (SAT).
|
||||
*/
|
||||
if (!scsi_get_vpd_page(sdev, 0x89, buffer, SD_BUF_SIZE))
|
||||
if (!scsi_get_vpd_page(sdev, 0x89, buffer, vpd_buf_len))
|
||||
sdev->no_write_same = 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ struct proto_ops {
|
|||
int offset, size_t size, int flags);
|
||||
ssize_t (*splice_read)(struct socket *sock, loff_t *ppos,
|
||||
struct pipe_inode_info *pipe, size_t len, unsigned int flags);
|
||||
void (*set_peek_off)(struct sock *sk, int val);
|
||||
int (*set_peek_off)(struct sock *sk, int val);
|
||||
};
|
||||
|
||||
#define DECLARE_SOCKADDR(type, dst, src) \
|
||||
|
|
|
|||
|
|
@ -1772,6 +1772,15 @@ static inline int dev_parse_header(const struct sk_buff *skb,
|
|||
return dev->header_ops->parse(skb, haddr);
|
||||
}
|
||||
|
||||
static inline int dev_rebuild_header(struct sk_buff *skb)
|
||||
{
|
||||
const struct net_device *dev = skb->dev;
|
||||
|
||||
if (!dev->header_ops || !dev->header_ops->rebuild)
|
||||
return 0;
|
||||
return dev->header_ops->rebuild(skb);
|
||||
}
|
||||
|
||||
typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len);
|
||||
extern int register_gifconf(unsigned int family, gifconf_func_t * gifconf);
|
||||
static inline int unregister_gifconf(unsigned int family)
|
||||
|
|
|
|||
|
|
@ -1741,6 +1741,11 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
|
|||
}
|
||||
#endif /* NET_SKBUFF_DATA_USES_OFFSET */
|
||||
|
||||
static inline void skb_pop_mac_header(struct sk_buff *skb)
|
||||
{
|
||||
skb->mac_header = skb->network_header;
|
||||
}
|
||||
|
||||
static inline void skb_probe_transport_header(struct sk_buff *skb,
|
||||
const int offset_hint)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7862,7 +7862,12 @@ static int tg_set_cfs_bandwidth(struct task_group *tg, u64 period, u64 quota)
|
|||
|
||||
runtime_enabled = quota != RUNTIME_INF;
|
||||
runtime_was_enabled = cfs_b->quota != RUNTIME_INF;
|
||||
account_cfs_bandwidth_used(runtime_enabled, runtime_was_enabled);
|
||||
/*
|
||||
* If we need to toggle cfs_bandwidth_used, off->on must occur
|
||||
* before making related changes, and on->off must occur afterwards
|
||||
*/
|
||||
if (runtime_enabled && !runtime_was_enabled)
|
||||
cfs_bandwidth_usage_inc();
|
||||
raw_spin_lock_irq(&cfs_b->lock);
|
||||
cfs_b->period = ns_to_ktime(period);
|
||||
cfs_b->quota = quota;
|
||||
|
|
@ -7888,6 +7893,8 @@ static int tg_set_cfs_bandwidth(struct task_group *tg, u64 period, u64 quota)
|
|||
unthrottle_cfs_rq(cfs_rq);
|
||||
raw_spin_unlock_irq(&rq->lock);
|
||||
}
|
||||
if (runtime_was_enabled && !runtime_enabled)
|
||||
cfs_bandwidth_usage_dec();
|
||||
out_unlock:
|
||||
mutex_unlock(&cfs_constraints_mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -2224,13 +2224,14 @@ static inline bool cfs_bandwidth_used(void)
|
|||
return static_key_false(&__cfs_bandwidth_used);
|
||||
}
|
||||
|
||||
void account_cfs_bandwidth_used(int enabled, int was_enabled)
|
||||
void cfs_bandwidth_usage_inc(void)
|
||||
{
|
||||
/* only need to count groups transitioning between enabled/!enabled */
|
||||
if (enabled && !was_enabled)
|
||||
static_key_slow_inc(&__cfs_bandwidth_used);
|
||||
else if (!enabled && was_enabled)
|
||||
static_key_slow_dec(&__cfs_bandwidth_used);
|
||||
static_key_slow_inc(&__cfs_bandwidth_used);
|
||||
}
|
||||
|
||||
void cfs_bandwidth_usage_dec(void)
|
||||
{
|
||||
static_key_slow_dec(&__cfs_bandwidth_used);
|
||||
}
|
||||
#else /* HAVE_JUMP_LABEL */
|
||||
static bool cfs_bandwidth_used(void)
|
||||
|
|
@ -2238,7 +2239,8 @@ static bool cfs_bandwidth_used(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
void account_cfs_bandwidth_used(int enabled, int was_enabled) {}
|
||||
void cfs_bandwidth_usage_inc(void) {}
|
||||
void cfs_bandwidth_usage_dec(void) {}
|
||||
#endif /* HAVE_JUMP_LABEL */
|
||||
|
||||
/*
|
||||
|
|
@ -2603,6 +2605,13 @@ static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun)
|
|||
if (idle)
|
||||
goto out_unlock;
|
||||
|
||||
/*
|
||||
* if we have relooped after returning idle once, we need to update our
|
||||
* status as actually running, so that other cpus doing
|
||||
* __start_cfs_bandwidth will stop trying to cancel us.
|
||||
*/
|
||||
cfs_b->timer_active = 1;
|
||||
|
||||
__refill_cfs_bandwidth_runtime(cfs_b);
|
||||
|
||||
if (!throttled) {
|
||||
|
|
@ -2663,7 +2672,13 @@ static const u64 min_bandwidth_expiration = 2 * NSEC_PER_MSEC;
|
|||
/* how long we wait to gather additional slack before distributing */
|
||||
static const u64 cfs_bandwidth_slack_period = 5 * NSEC_PER_MSEC;
|
||||
|
||||
/* are we near the end of the current quota period? */
|
||||
/*
|
||||
* Are we near the end of the current quota period?
|
||||
*
|
||||
* Requires cfs_b->lock for hrtimer_expires_remaining to be safe against the
|
||||
* hrtimer base being cleared by __hrtimer_start_range_ns. In the case of
|
||||
* migrate_hrtimers, base is never cleared, so we are fine.
|
||||
*/
|
||||
static int runtime_refresh_within(struct cfs_bandwidth *cfs_b, u64 min_expire)
|
||||
{
|
||||
struct hrtimer *refresh_timer = &cfs_b->period_timer;
|
||||
|
|
@ -2739,10 +2754,12 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
|
|||
u64 expires;
|
||||
|
||||
/* confirm we're still not at a refresh boundary */
|
||||
if (runtime_refresh_within(cfs_b, min_bandwidth_expiration))
|
||||
return;
|
||||
|
||||
raw_spin_lock(&cfs_b->lock);
|
||||
if (runtime_refresh_within(cfs_b, min_bandwidth_expiration)) {
|
||||
raw_spin_unlock(&cfs_b->lock);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cfs_b->quota != RUNTIME_INF && cfs_b->runtime > slice) {
|
||||
runtime = cfs_b->runtime;
|
||||
cfs_b->runtime = 0;
|
||||
|
|
@ -2867,11 +2884,11 @@ void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
|
|||
* (timer_active==0 becomes visible before the hrtimer call-back
|
||||
* terminates). In either case we ensure that it's re-programmed
|
||||
*/
|
||||
while (unlikely(hrtimer_active(&cfs_b->period_timer))) {
|
||||
while (unlikely(hrtimer_active(&cfs_b->period_timer)) &&
|
||||
hrtimer_try_to_cancel(&cfs_b->period_timer) < 0) {
|
||||
/* bounce the lock to allow do_sched_cfs_period_timer to run */
|
||||
raw_spin_unlock(&cfs_b->lock);
|
||||
/* ensure cfs_b->lock is available while we wait */
|
||||
hrtimer_cancel(&cfs_b->period_timer);
|
||||
|
||||
cpu_relax();
|
||||
raw_spin_lock(&cfs_b->lock);
|
||||
/* if someone else restarted the timer then we're done */
|
||||
if (cfs_b->timer_active)
|
||||
|
|
@ -7619,7 +7636,8 @@ void init_tg_cfs_entry(struct task_group *tg, struct cfs_rq *cfs_rq,
|
|||
se->cfs_rq = parent->my_q;
|
||||
|
||||
se->my_q = cfs_rq;
|
||||
update_load_set(&se->load, 0);
|
||||
/* guarantee group entities always have weight */
|
||||
update_load_set(&se->load, NICE_0_LOAD);
|
||||
se->parent = parent;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1327,7 +1327,8 @@ extern void print_rt_stats(struct seq_file *m, int cpu);
|
|||
extern void init_cfs_rq(struct cfs_rq *cfs_rq);
|
||||
extern void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq);
|
||||
|
||||
extern void account_cfs_bandwidth_used(int enabled, int was_enabled);
|
||||
extern void cfs_bandwidth_usage_inc(void);
|
||||
extern void cfs_bandwidth_usage_dec(void);
|
||||
|
||||
#ifdef CONFIG_NO_HZ_COMMON
|
||||
enum rq_nohz_flag_bits {
|
||||
|
|
|
|||
|
|
@ -30,3 +30,11 @@ CONFIG_FUSE_FS=y
|
|||
CONFIG_CPU_FREQ_GOV_INTERACTIVE=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
|
||||
CONFIG_ION=y
|
||||
CONFIG_SYNC=y
|
||||
CONFIG_SW_SYNC=y
|
||||
CONFIG_SW_SYNC_USER=y
|
||||
CONFIG_ION_TEST=y
|
||||
CONFIG_ADF=y
|
||||
CONFIG_ADF_FBDEV=y
|
||||
CONFIG_ADF_MEMBLOCK=y
|
||||
CONFIG_DMA_SHARED_BUFFER=y
|
||||
|
|
|
|||
|
|
@ -57,3 +57,7 @@ CONFIG_LEDS_GPIO=y
|
|||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_LEDS_TRIGGER_CPU=y
|
||||
CONFIG_VIRTIO=y
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
||||
|
|
|
|||
|
|
@ -549,6 +549,23 @@ static const struct header_ops vlan_header_ops = {
|
|||
.parse = eth_header_parse,
|
||||
};
|
||||
|
||||
static int vlan_passthru_hard_header(struct sk_buff *skb, struct net_device *dev,
|
||||
unsigned short type,
|
||||
const void *daddr, const void *saddr,
|
||||
unsigned int len)
|
||||
{
|
||||
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
|
||||
struct net_device *real_dev = vlan->real_dev;
|
||||
|
||||
return dev_hard_header(skb, real_dev, type, daddr, saddr, len);
|
||||
}
|
||||
|
||||
static const struct header_ops vlan_passthru_header_ops = {
|
||||
.create = vlan_passthru_hard_header,
|
||||
.rebuild = dev_rebuild_header,
|
||||
.parse = eth_header_parse,
|
||||
};
|
||||
|
||||
static struct device_type vlan_type = {
|
||||
.name = "vlan",
|
||||
};
|
||||
|
|
@ -592,7 +609,7 @@ static int vlan_dev_init(struct net_device *dev)
|
|||
|
||||
dev->needed_headroom = real_dev->needed_headroom;
|
||||
if (real_dev->features & NETIF_F_HW_VLAN_CTAG_TX) {
|
||||
dev->header_ops = real_dev->header_ops;
|
||||
dev->header_ops = &vlan_passthru_header_ops;
|
||||
dev->hard_header_len = real_dev->hard_header_len;
|
||||
} else {
|
||||
dev->header_ops = &vlan_header_ops;
|
||||
|
|
|
|||
|
|
@ -1839,7 +1839,7 @@ int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val)
|
|||
u32 old;
|
||||
struct net_bridge_mdb_htable *mdb;
|
||||
|
||||
spin_lock(&br->multicast_lock);
|
||||
spin_lock_bh(&br->multicast_lock);
|
||||
if (!netif_running(br->dev))
|
||||
goto unlock;
|
||||
|
||||
|
|
@ -1871,7 +1871,7 @@ int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val)
|
|||
}
|
||||
|
||||
unlock:
|
||||
spin_unlock(&br->multicast_lock);
|
||||
spin_unlock_bh(&br->multicast_lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,7 +64,6 @@ static struct genl_family net_drop_monitor_family = {
|
|||
.hdrsize = 0,
|
||||
.name = "NET_DM",
|
||||
.version = 2,
|
||||
.maxattr = NET_DM_CMD_MAX,
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct per_cpu_dm_data, dm_cpu_data);
|
||||
|
|
|
|||
|
|
@ -1274,7 +1274,7 @@ int neigh_compat_output(struct neighbour *neigh, struct sk_buff *skb)
|
|||
|
||||
if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
|
||||
skb->len) < 0 &&
|
||||
dev->header_ops->rebuild(skb))
|
||||
dev_rebuild_header(skb))
|
||||
return 0;
|
||||
|
||||
return dev_queue_xmit(skb);
|
||||
|
|
|
|||
|
|
@ -386,8 +386,14 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb,
|
|||
!vlan_hw_offload_capable(netif_skb_features(skb),
|
||||
skb->vlan_proto)) {
|
||||
skb = __vlan_put_tag(skb, skb->vlan_proto, vlan_tx_tag_get(skb));
|
||||
if (unlikely(!skb))
|
||||
break;
|
||||
if (unlikely(!skb)) {
|
||||
/* This is actually a packet drop, but we
|
||||
* don't want the code at the end of this
|
||||
* function to try and re-queue a NULL skb.
|
||||
*/
|
||||
status = NETDEV_TX_OK;
|
||||
goto unlock_txq;
|
||||
}
|
||||
skb->vlan_tci = 0;
|
||||
}
|
||||
|
||||
|
|
@ -395,6 +401,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb,
|
|||
if (status == NETDEV_TX_OK)
|
||||
txq_trans_update(txq);
|
||||
}
|
||||
unlock_txq:
|
||||
__netif_tx_unlock(txq);
|
||||
|
||||
if (status == NETDEV_TX_OK)
|
||||
|
|
|
|||
|
|
@ -2854,7 +2854,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
|
|||
doffset + tnl_hlen);
|
||||
|
||||
if (fskb != skb_shinfo(skb)->frag_list)
|
||||
continue;
|
||||
goto perform_csum_check;
|
||||
|
||||
if (!sg) {
|
||||
nskb->ip_summed = CHECKSUM_NONE;
|
||||
|
|
@ -2918,6 +2918,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
|
|||
nskb->len += nskb->data_len;
|
||||
nskb->truesize += nskb->data_len;
|
||||
|
||||
perform_csum_check:
|
||||
if (!csum) {
|
||||
nskb->csum = skb_checksum(nskb, doffset,
|
||||
nskb->len - doffset, 0);
|
||||
|
|
|
|||
|
|
@ -885,7 +885,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
|
|||
|
||||
case SO_PEEK_OFF:
|
||||
if (sock->ops->set_peek_off)
|
||||
sock->ops->set_peek_off(sk, val);
|
||||
ret = sock->ops->set_peek_off(sk, val);
|
||||
else
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -106,6 +106,10 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
|
|||
|
||||
r->id.idiag_sport = inet->inet_sport;
|
||||
r->id.idiag_dport = inet->inet_dport;
|
||||
|
||||
memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
|
||||
memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
|
||||
|
||||
r->id.idiag_src[0] = inet->inet_rcv_saddr;
|
||||
r->id.idiag_dst[0] = inet->inet_daddr;
|
||||
|
||||
|
|
@ -240,12 +244,19 @@ static int inet_twsk_diag_fill(struct inet_timewait_sock *tw,
|
|||
|
||||
r->idiag_family = tw->tw_family;
|
||||
r->idiag_retrans = 0;
|
||||
|
||||
r->id.idiag_if = tw->tw_bound_dev_if;
|
||||
sock_diag_save_cookie(tw, r->id.idiag_cookie);
|
||||
|
||||
r->id.idiag_sport = tw->tw_sport;
|
||||
r->id.idiag_dport = tw->tw_dport;
|
||||
|
||||
memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
|
||||
memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
|
||||
|
||||
r->id.idiag_src[0] = tw->tw_rcv_saddr;
|
||||
r->id.idiag_dst[0] = tw->tw_daddr;
|
||||
|
||||
r->idiag_state = tw->tw_substate;
|
||||
r->idiag_timer = 3;
|
||||
r->idiag_expires = DIV_ROUND_UP(tmo * 1000, HZ);
|
||||
|
|
@ -732,8 +743,13 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
|
|||
|
||||
r->id.idiag_sport = inet->inet_sport;
|
||||
r->id.idiag_dport = ireq->rmt_port;
|
||||
|
||||
memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
|
||||
memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
|
||||
|
||||
r->id.idiag_src[0] = ireq->loc_addr;
|
||||
r->id.idiag_dst[0] = ireq->rmt_addr;
|
||||
|
||||
r->idiag_expires = jiffies_to_msecs(tmo);
|
||||
r->idiag_rqueue = 0;
|
||||
r->idiag_wqueue = 0;
|
||||
|
|
|
|||
|
|
@ -335,6 +335,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||
iph->saddr, iph->daddr, tpi.key);
|
||||
|
||||
if (tunnel) {
|
||||
skb_pop_mac_header(skb);
|
||||
ip_tunnel_rcv(tunnel, skb, &tpi, hdr_len, log_ecn_error);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,6 +84,8 @@ static int ip6_dst_gc(struct dst_ops *ops);
|
|||
|
||||
static int ip6_pkt_discard(struct sk_buff *skb);
|
||||
static int ip6_pkt_discard_out(struct sk_buff *skb);
|
||||
static int ip6_pkt_prohibit(struct sk_buff *skb);
|
||||
static int ip6_pkt_prohibit_out(struct sk_buff *skb);
|
||||
static void ip6_link_failure(struct sk_buff *skb);
|
||||
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
||||
struct sk_buff *skb, u32 mtu);
|
||||
|
|
@ -233,9 +235,6 @@ static const struct rt6_info ip6_null_entry_template = {
|
|||
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
|
||||
static int ip6_pkt_prohibit(struct sk_buff *skb);
|
||||
static int ip6_pkt_prohibit_out(struct sk_buff *skb);
|
||||
|
||||
static const struct rt6_info ip6_prohibit_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
|
|
@ -1498,21 +1497,24 @@ int ip6_route_add(struct fib6_config *cfg)
|
|||
goto out;
|
||||
}
|
||||
}
|
||||
rt->dst.output = ip6_pkt_discard_out;
|
||||
rt->dst.input = ip6_pkt_discard;
|
||||
rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP;
|
||||
switch (cfg->fc_type) {
|
||||
case RTN_BLACKHOLE:
|
||||
rt->dst.error = -EINVAL;
|
||||
rt->dst.output = dst_discard;
|
||||
rt->dst.input = dst_discard;
|
||||
break;
|
||||
case RTN_PROHIBIT:
|
||||
rt->dst.error = -EACCES;
|
||||
rt->dst.output = ip6_pkt_prohibit_out;
|
||||
rt->dst.input = ip6_pkt_prohibit;
|
||||
break;
|
||||
case RTN_THROW:
|
||||
rt->dst.error = -EAGAIN;
|
||||
break;
|
||||
default:
|
||||
rt->dst.error = -ENETUNREACH;
|
||||
rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN
|
||||
: -ENETUNREACH;
|
||||
rt->dst.output = ip6_pkt_discard_out;
|
||||
rt->dst.input = ip6_pkt_discard;
|
||||
break;
|
||||
}
|
||||
goto install_route;
|
||||
|
|
@ -1836,9 +1838,7 @@ static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
|
|||
else
|
||||
rt->rt6i_gateway = *dest;
|
||||
rt->rt6i_flags = ort->rt6i_flags;
|
||||
if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ==
|
||||
(RTF_DEFAULT | RTF_ADDRCONF))
|
||||
rt6_set_from(rt, ort);
|
||||
rt6_set_from(rt, ort);
|
||||
rt->rt6i_metric = 0;
|
||||
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
|
|
@ -2077,8 +2077,6 @@ static int ip6_pkt_discard_out(struct sk_buff *skb)
|
|||
return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
|
||||
static int ip6_pkt_prohibit(struct sk_buff *skb)
|
||||
{
|
||||
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
|
||||
|
|
@ -2090,8 +2088,6 @@ static int ip6_pkt_prohibit_out(struct sk_buff *skb)
|
|||
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Allocate a dst for local (unicast / anycast) address.
|
||||
*/
|
||||
|
|
@ -2101,12 +2097,10 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
|||
bool anycast)
|
||||
{
|
||||
struct net *net = dev_net(idev->dev);
|
||||
struct rt6_info *rt = ip6_dst_alloc(net, net->loopback_dev, 0, NULL);
|
||||
|
||||
if (!rt) {
|
||||
net_warn_ratelimited("Maximum number of routes reached, consider increasing route/max_size\n");
|
||||
struct rt6_info *rt = ip6_dst_alloc(net, net->loopback_dev,
|
||||
DST_NOCOUNT, NULL);
|
||||
if (!rt)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
in6_dev_hold(idev);
|
||||
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
|
|||
|
||||
/* Check if there is enough headroom to insert fragment header. */
|
||||
tnl_hlen = skb_tnl_header_len(skb);
|
||||
if (skb->mac_header < (tnl_hlen + frag_hdr_sz)) {
|
||||
if (skb_mac_header(skb) < skb->head + tnl_hlen + frag_hdr_sz) {
|
||||
if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz))
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -715,7 +715,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
unsigned long cpu_flags;
|
||||
size_t copied = 0;
|
||||
u32 peek_seq = 0;
|
||||
u32 *seq;
|
||||
u32 *seq, skb_len;
|
||||
unsigned long used;
|
||||
int target; /* Read at least this many bytes */
|
||||
long timeo;
|
||||
|
|
@ -812,6 +812,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
}
|
||||
continue;
|
||||
found_ok_skb:
|
||||
skb_len = skb->len;
|
||||
/* Ok so how much can we use? */
|
||||
used = skb->len - offset;
|
||||
if (len < used)
|
||||
|
|
@ -844,7 +845,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
}
|
||||
|
||||
/* Partial read */
|
||||
if (used + offset < skb->len)
|
||||
if (used + offset < skb_len)
|
||||
continue;
|
||||
} while (len > 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -447,7 +447,6 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|||
{
|
||||
struct sta_info *sta = tx->sta;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||
struct ieee80211_local *local = tx->local;
|
||||
|
||||
if (unlikely(!sta))
|
||||
|
|
@ -458,15 +457,6 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|||
!(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {
|
||||
int ac = skb_get_queue_mapping(tx->skb);
|
||||
|
||||
/* only deauth, disassoc and action are bufferable MMPDUs */
|
||||
if (ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
!ieee80211_is_deauth(hdr->frame_control) &&
|
||||
!ieee80211_is_disassoc(hdr->frame_control) &&
|
||||
!ieee80211_is_action(hdr->frame_control)) {
|
||||
info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
|
||||
return TX_CONTINUE;
|
||||
}
|
||||
|
||||
ps_dbg(sta->sdata, "STA %pM aid %d: PS buffer for AC %d\n",
|
||||
sta->sta.addr, sta->sta.aid, ac);
|
||||
if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
|
||||
|
|
@ -509,9 +499,22 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|||
static ieee80211_tx_result debug_noinline
|
||||
ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||
|
||||
if (unlikely(tx->flags & IEEE80211_TX_PS_BUFFERED))
|
||||
return TX_CONTINUE;
|
||||
|
||||
/* only deauth, disassoc and action are bufferable MMPDUs */
|
||||
if (ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
!ieee80211_is_deauth(hdr->frame_control) &&
|
||||
!ieee80211_is_disassoc(hdr->frame_control) &&
|
||||
!ieee80211_is_action(hdr->frame_control)) {
|
||||
if (tx->flags & IEEE80211_TX_UNICAST)
|
||||
info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
|
||||
return TX_CONTINUE;
|
||||
}
|
||||
|
||||
if (tx->flags & IEEE80211_TX_UNICAST)
|
||||
return ieee80211_tx_h_unicast_ps_buf(tx);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -34,10 +34,14 @@ static unsigned int help(struct sk_buff *skb,
|
|||
struct nf_conntrack_expect *exp)
|
||||
{
|
||||
char buffer[sizeof("4294967296 65635")];
|
||||
struct nf_conn *ct = exp->master;
|
||||
union nf_inet_addr newaddr;
|
||||
u_int16_t port;
|
||||
unsigned int ret;
|
||||
|
||||
/* Reply comes from server. */
|
||||
newaddr = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3;
|
||||
|
||||
exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port;
|
||||
exp->dir = IP_CT_DIR_REPLY;
|
||||
exp->expectfn = nf_nat_follow_master;
|
||||
|
|
@ -57,17 +61,35 @@ static unsigned int help(struct sk_buff *skb,
|
|||
}
|
||||
|
||||
if (port == 0) {
|
||||
nf_ct_helper_log(skb, exp->master, "all ports in use");
|
||||
nf_ct_helper_log(skb, ct, "all ports in use");
|
||||
return NF_DROP;
|
||||
}
|
||||
|
||||
ret = nf_nat_mangle_tcp_packet(skb, exp->master, ctinfo,
|
||||
protoff, matchoff, matchlen, buffer,
|
||||
strlen(buffer));
|
||||
/* strlen("\1DCC CHAT chat AAAAAAAA P\1\n")=27
|
||||
* strlen("\1DCC SCHAT chat AAAAAAAA P\1\n")=28
|
||||
* strlen("\1DCC SEND F AAAAAAAA P S\1\n")=26
|
||||
* strlen("\1DCC MOVE F AAAAAAAA P S\1\n")=26
|
||||
* strlen("\1DCC TSEND F AAAAAAAA P S\1\n")=27
|
||||
*
|
||||
* AAAAAAAAA: bound addr (1.0.0.0==16777216, min 8 digits,
|
||||
* 255.255.255.255==4294967296, 10 digits)
|
||||
* P: bound port (min 1 d, max 5d (65635))
|
||||
* F: filename (min 1 d )
|
||||
* S: size (min 1 d )
|
||||
* 0x01, \n: terminators
|
||||
*/
|
||||
/* AAA = "us", ie. where server normally talks to. */
|
||||
snprintf(buffer, sizeof(buffer), "%u %u", ntohl(newaddr.ip), port);
|
||||
pr_debug("nf_nat_irc: inserting '%s' == %pI4, port %u\n",
|
||||
buffer, &newaddr.ip, port);
|
||||
|
||||
ret = nf_nat_mangle_tcp_packet(skb, ct, ctinfo, protoff, matchoff,
|
||||
matchlen, buffer, strlen(buffer));
|
||||
if (ret != NF_ACCEPT) {
|
||||
nf_ct_helper_log(skb, exp->master, "cannot mangle packet");
|
||||
nf_ct_helper_log(skb, ct, "cannot mangle packet");
|
||||
nf_ct_unexpect_related(exp);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -237,6 +237,30 @@ struct packet_skb_cb {
|
|||
static void __fanout_unlink(struct sock *sk, struct packet_sock *po);
|
||||
static void __fanout_link(struct sock *sk, struct packet_sock *po);
|
||||
|
||||
static struct net_device *packet_cached_dev_get(struct packet_sock *po)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
rcu_read_lock();
|
||||
dev = rcu_dereference(po->cached_dev);
|
||||
if (likely(dev))
|
||||
dev_hold(dev);
|
||||
rcu_read_unlock();
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
static void packet_cached_dev_assign(struct packet_sock *po,
|
||||
struct net_device *dev)
|
||||
{
|
||||
rcu_assign_pointer(po->cached_dev, dev);
|
||||
}
|
||||
|
||||
static void packet_cached_dev_reset(struct packet_sock *po)
|
||||
{
|
||||
RCU_INIT_POINTER(po->cached_dev, NULL);
|
||||
}
|
||||
|
||||
/* register_prot_hook must be invoked with the po->bind_lock held,
|
||||
* or from a context in which asynchronous accesses to the packet
|
||||
* socket is not possible (packet_create()).
|
||||
|
|
@ -246,12 +270,10 @@ static void register_prot_hook(struct sock *sk)
|
|||
struct packet_sock *po = pkt_sk(sk);
|
||||
|
||||
if (!po->running) {
|
||||
if (po->fanout) {
|
||||
if (po->fanout)
|
||||
__fanout_link(sk, po);
|
||||
} else {
|
||||
else
|
||||
dev_add_pack(&po->prot_hook);
|
||||
rcu_assign_pointer(po->cached_dev, po->prot_hook.dev);
|
||||
}
|
||||
|
||||
sock_hold(sk);
|
||||
po->running = 1;
|
||||
|
|
@ -270,12 +292,11 @@ static void __unregister_prot_hook(struct sock *sk, bool sync)
|
|||
struct packet_sock *po = pkt_sk(sk);
|
||||
|
||||
po->running = 0;
|
||||
if (po->fanout) {
|
||||
|
||||
if (po->fanout)
|
||||
__fanout_unlink(sk, po);
|
||||
} else {
|
||||
else
|
||||
__dev_remove_pack(&po->prot_hook);
|
||||
RCU_INIT_POINTER(po->cached_dev, NULL);
|
||||
}
|
||||
|
||||
__sock_put(sk);
|
||||
|
||||
|
|
@ -2048,19 +2069,6 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
|
|||
return tp_len;
|
||||
}
|
||||
|
||||
static struct net_device *packet_cached_dev_get(struct packet_sock *po)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
rcu_read_lock();
|
||||
dev = rcu_dereference(po->cached_dev);
|
||||
if (dev)
|
||||
dev_hold(dev);
|
||||
rcu_read_unlock();
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
|
@ -2077,7 +2085,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
|||
|
||||
mutex_lock(&po->pg_vec_lock);
|
||||
|
||||
if (saddr == NULL) {
|
||||
if (likely(saddr == NULL)) {
|
||||
dev = packet_cached_dev_get(po);
|
||||
proto = po->num;
|
||||
addr = NULL;
|
||||
|
|
@ -2231,7 +2239,7 @@ static int packet_snd(struct socket *sock,
|
|||
* Get and verify the address.
|
||||
*/
|
||||
|
||||
if (saddr == NULL) {
|
||||
if (likely(saddr == NULL)) {
|
||||
dev = packet_cached_dev_get(po);
|
||||
proto = po->num;
|
||||
addr = NULL;
|
||||
|
|
@ -2440,6 +2448,8 @@ static int packet_release(struct socket *sock)
|
|||
|
||||
spin_lock(&po->bind_lock);
|
||||
unregister_prot_hook(sk, false);
|
||||
packet_cached_dev_reset(po);
|
||||
|
||||
if (po->prot_hook.dev) {
|
||||
dev_put(po->prot_hook.dev);
|
||||
po->prot_hook.dev = NULL;
|
||||
|
|
@ -2495,14 +2505,17 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 protoc
|
|||
|
||||
spin_lock(&po->bind_lock);
|
||||
unregister_prot_hook(sk, true);
|
||||
|
||||
po->num = protocol;
|
||||
po->prot_hook.type = protocol;
|
||||
if (po->prot_hook.dev)
|
||||
dev_put(po->prot_hook.dev);
|
||||
po->prot_hook.dev = dev;
|
||||
|
||||
po->prot_hook.dev = dev;
|
||||
po->ifindex = dev ? dev->ifindex : 0;
|
||||
|
||||
packet_cached_dev_assign(po, dev);
|
||||
|
||||
if (protocol == 0)
|
||||
goto out_unlock;
|
||||
|
||||
|
|
@ -2615,7 +2628,8 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
|
|||
po = pkt_sk(sk);
|
||||
sk->sk_family = PF_PACKET;
|
||||
po->num = proto;
|
||||
RCU_INIT_POINTER(po->cached_dev, NULL);
|
||||
|
||||
packet_cached_dev_reset(po);
|
||||
|
||||
sk->sk_destruct = packet_sock_destruct;
|
||||
sk_refcnt_debug_inc(sk);
|
||||
|
|
@ -3369,6 +3383,7 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void
|
|||
sk->sk_error_report(sk);
|
||||
}
|
||||
if (msg == NETDEV_UNREGISTER) {
|
||||
packet_cached_dev_reset(po);
|
||||
po->ifindex = -1;
|
||||
if (po->prot_hook.dev)
|
||||
dev_put(po->prot_hook.dev);
|
||||
|
|
|
|||
|
|
@ -338,7 +338,8 @@ static int rds_ib_laddr_check(__be32 addr)
|
|||
ret = rdma_bind_addr(cm_id, (struct sockaddr *)&sin);
|
||||
/* due to this, we will claim to support iWARP devices unless we
|
||||
check node_type. */
|
||||
if (ret || cm_id->device->node_type != RDMA_NODE_IB_CA)
|
||||
if (ret || !cm_id->device ||
|
||||
cm_id->device->node_type != RDMA_NODE_IB_CA)
|
||||
ret = -EADDRNOTAVAIL;
|
||||
|
||||
rdsdebug("addr %pI4 ret %d node type %d\n",
|
||||
|
|
|
|||
|
|
@ -552,9 +552,8 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,
|
|||
&& rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) {
|
||||
rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
|
||||
scat = &rm->data.op_sg[sg];
|
||||
ret = sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
|
||||
ret = min_t(int, ret, scat->length - conn->c_xmit_data_off);
|
||||
return ret;
|
||||
ret = max_t(int, RDS_CONG_MAP_BYTES, scat->length);
|
||||
return sizeof(struct rds_header) + ret;
|
||||
}
|
||||
|
||||
/* FIXME we may overallocate here */
|
||||
|
|
|
|||
|
|
@ -1253,6 +1253,7 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
|
||||
if (msg->msg_name) {
|
||||
struct sockaddr_rose *srose;
|
||||
struct full_sockaddr_rose *full_srose = msg->msg_name;
|
||||
|
||||
memset(msg->msg_name, 0, sizeof(struct full_sockaddr_rose));
|
||||
srose = msg->msg_name;
|
||||
|
|
@ -1260,18 +1261,9 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
srose->srose_addr = rose->dest_addr;
|
||||
srose->srose_call = rose->dest_call;
|
||||
srose->srose_ndigis = rose->dest_ndigis;
|
||||
if (msg->msg_namelen >= sizeof(struct full_sockaddr_rose)) {
|
||||
struct full_sockaddr_rose *full_srose = (struct full_sockaddr_rose *)msg->msg_name;
|
||||
for (n = 0 ; n < rose->dest_ndigis ; n++)
|
||||
full_srose->srose_digis[n] = rose->dest_digis[n];
|
||||
msg->msg_namelen = sizeof(struct full_sockaddr_rose);
|
||||
} else {
|
||||
if (rose->dest_ndigis >= 1) {
|
||||
srose->srose_ndigis = 1;
|
||||
srose->srose_digi = rose->dest_digis[0];
|
||||
}
|
||||
msg->msg_namelen = sizeof(struct sockaddr_rose);
|
||||
}
|
||||
for (n = 0 ; n < rose->dest_ndigis ; n++)
|
||||
full_srose->srose_digis[n] = rose->dest_digis[n];
|
||||
msg->msg_namelen = sizeof(struct full_sockaddr_rose);
|
||||
}
|
||||
|
||||
skb_free_datagram(sk, skb);
|
||||
|
|
|
|||
|
|
@ -530,13 +530,17 @@ static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
|
|||
static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *,
|
||||
struct msghdr *, size_t, int);
|
||||
|
||||
static void unix_set_peek_off(struct sock *sk, int val)
|
||||
static int unix_set_peek_off(struct sock *sk, int val)
|
||||
{
|
||||
struct unix_sock *u = unix_sk(sk);
|
||||
|
||||
mutex_lock(&u->readlock);
|
||||
if (mutex_lock_interruptible(&u->readlock))
|
||||
return -EINTR;
|
||||
|
||||
sk->sk_peek_off = val;
|
||||
mutex_unlock(&u->readlock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -714,7 +718,9 @@ static int unix_autobind(struct socket *sock)
|
|||
int err;
|
||||
unsigned int retries = 0;
|
||||
|
||||
mutex_lock(&u->readlock);
|
||||
err = mutex_lock_interruptible(&u->readlock);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = 0;
|
||||
if (u->addr)
|
||||
|
|
@ -873,7 +879,9 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|||
goto out;
|
||||
addr_len = err;
|
||||
|
||||
mutex_lock(&u->readlock);
|
||||
err = mutex_lock_interruptible(&u->readlock);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = -EINVAL;
|
||||
if (u->addr)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user