Linux v3.6-6670-gecefbd9
This commit is contained in:
parent
386d01e31a
commit
fc85362a27
@ -1,10 +0,0 @@
|
||||
--- linux-3.6.0-0.rc3.git2.1.fc18.x86_64/drivers/staging/omapdrm/omap_drv.c.orig 2012-08-28 22:52:35.950826671 +0100
|
||||
+++ linux-3.6.0-0.rc3.git2.1.fc18.x86_64/drivers/staging/omapdrm/omap_drv.c 2012-08-28 22:52:49.393910353 +0100
|
||||
@@ -761,7 +761,6 @@
|
||||
.irq_postinstall = dev_irq_postinstall,
|
||||
.irq_uninstall = dev_irq_uninstall,
|
||||
.irq_handler = dev_irq_handler,
|
||||
- .reclaim_buffers = drm_core_reclaim_buffers,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_init = omap_debugfs_init,
|
||||
.debugfs_cleanup = omap_debugfs_cleanup,
|
@ -1456,13 +1456,13 @@ CONFIG_B43_SDIO=y
|
||||
CONFIG_B43_BCMA=y
|
||||
# CONFIG_B43_BCMA_EXTRA is not set
|
||||
CONFIG_B43_BCMA_PIO=y
|
||||
# CONFIG_B43_DEBUG is not set
|
||||
CONFIG_B43_DEBUG=y
|
||||
CONFIG_B43_PHY_LP=y
|
||||
CONFIG_B43_PHY_N=y
|
||||
CONFIG_B43_PHY_HT=y
|
||||
# CONFIG_B43_FORCE_PIO is not set
|
||||
CONFIG_B43LEGACY=m
|
||||
# CONFIG_B43LEGACY_DEBUG is not set
|
||||
CONFIG_B43LEGACY_DEBUG=y
|
||||
CONFIG_B43LEGACY_DMA=y
|
||||
CONFIG_B43LEGACY_PIO=y
|
||||
CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
|
||||
@ -3028,7 +3028,7 @@ CONFIG_USB_STORAGE_REALTEK=m
|
||||
CONFIG_REALTEK_AUTOPM=y
|
||||
CONFIG_USB_STORAGE_ENE_UB6250=m
|
||||
# CONFIG_USB_LIBUSUAL is not set
|
||||
# CONFIG_USB_UAS is not set
|
||||
CONFIG_USB_UAS=m
|
||||
|
||||
|
||||
#
|
||||
@ -3981,7 +3981,7 @@ CONFIG_IBMASR=m
|
||||
CONFIG_PM_DEBUG=y
|
||||
CONFIG_PM_TRACE=y
|
||||
CONFIG_PM_TRACE_RTC=y
|
||||
# CONFIG_PM_TEST_SUSPEND is not set
|
||||
CONFIG_PM_TEST_SUSPEND=y
|
||||
CONFIG_PM_RUNTIME=y
|
||||
# CONFIG_PM_OPP is not set
|
||||
# CONFIG_PM_AUTOSLEEP is not set
|
||||
|
110
config-nodebug
110
config-nodebug
@ -2,111 +2,111 @@ CONFIG_SND_VERBOSE_PRINTK=y
|
||||
CONFIG_SND_DEBUG=y
|
||||
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||
|
||||
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_PROVE_RCU is not set
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_LOCK_ALLOC=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_PROVE_RCU=y
|
||||
# CONFIG_PROVE_RCU_REPEATEDLY is not set
|
||||
# CONFIG_DEBUG_PER_CPU_MAPS is not set
|
||||
CONFIG_DEBUG_PER_CPU_MAPS=y
|
||||
CONFIG_CPUMASK_OFFSTACK=y
|
||||
|
||||
# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
|
||||
CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
|
||||
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_FAILSLAB is not set
|
||||
# CONFIG_FAIL_PAGE_ALLOC is not set
|
||||
# CONFIG_FAIL_MAKE_REQUEST is not set
|
||||
# CONFIG_FAULT_INJECTION_DEBUG_FS is not set
|
||||
# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
|
||||
# CONFIG_FAIL_IO_TIMEOUT is not set
|
||||
# CONFIG_FAIL_MMC_REQUEST is not set
|
||||
CONFIG_FAULT_INJECTION=y
|
||||
CONFIG_FAILSLAB=y
|
||||
CONFIG_FAIL_PAGE_ALLOC=y
|
||||
CONFIG_FAIL_MAKE_REQUEST=y
|
||||
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||
CONFIG_FAIL_IO_TIMEOUT=y
|
||||
CONFIG_FAIL_MMC_REQUEST=y
|
||||
|
||||
# CONFIG_SLUB_DEBUG_ON is not set
|
||||
CONFIG_SLUB_DEBUG_ON=y
|
||||
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
CONFIG_LOCK_STAT=y
|
||||
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
|
||||
# CONFIG_ACPI_DEBUG is not set
|
||||
CONFIG_ACPI_DEBUG=y
|
||||
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
|
||||
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
CONFIG_DEBUG_SG=y
|
||||
|
||||
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
CONFIG_DEBUG_WRITECOUNT=y
|
||||
CONFIG_DEBUG_OBJECTS=y
|
||||
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
|
||||
# CONFIG_DEBUG_OBJECTS_FREE is not set
|
||||
# CONFIG_DEBUG_OBJECTS_TIMERS is not set
|
||||
# CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set
|
||||
CONFIG_DEBUG_OBJECTS_FREE=y
|
||||
CONFIG_DEBUG_OBJECTS_TIMERS=y
|
||||
CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
|
||||
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||
|
||||
# CONFIG_X86_PTDUMP is not set
|
||||
CONFIG_X86_PTDUMP=y
|
||||
|
||||
# CONFIG_CAN_DEBUG_DEVICES is not set
|
||||
CONFIG_CAN_DEBUG_DEVICES=y
|
||||
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
|
||||
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
CONFIG_DEBUG_NOTIFIERS=y
|
||||
|
||||
# CONFIG_DMA_API_DEBUG is not set
|
||||
CONFIG_DMA_API_DEBUG=y
|
||||
|
||||
# CONFIG_MMIOTRACE is not set
|
||||
CONFIG_MMIOTRACE=y
|
||||
|
||||
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||
CONFIG_DEBUG_CREDENTIALS=y
|
||||
|
||||
# off in both production debug and nodebug builds,
|
||||
# on in rawhide nodebug builds
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
||||
|
||||
# CONFIG_EXT4_DEBUG is not set
|
||||
CONFIG_EXT4_DEBUG=y
|
||||
|
||||
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
|
||||
CONFIG_DEBUG_PERF_USE_VMALLOC=y
|
||||
|
||||
# CONFIG_JBD2_DEBUG is not set
|
||||
CONFIG_JBD2_DEBUG=y
|
||||
|
||||
# CONFIG_NFSD_FAULT_INJECTION is not set
|
||||
CONFIG_NFSD_FAULT_INJECTION=y
|
||||
|
||||
# CONFIG_DEBUG_BLK_CGROUP is not set
|
||||
CONFIG_DEBUG_BLK_CGROUP=y
|
||||
|
||||
# CONFIG_DRBD_FAULT_INJECTION is not set
|
||||
CONFIG_DRBD_FAULT_INJECTION=y
|
||||
|
||||
# CONFIG_ATH_DEBUG is not set
|
||||
# CONFIG_CARL9170_DEBUGFS is not set
|
||||
# CONFIG_IWLWIFI_DEVICE_TRACING is not set
|
||||
CONFIG_ATH_DEBUG=y
|
||||
CONFIG_CARL9170_DEBUGFS=y
|
||||
CONFIG_IWLWIFI_DEVICE_TRACING=y
|
||||
|
||||
# CONFIG_DEBUG_OBJECTS_WORK is not set
|
||||
CONFIG_DEBUG_OBJECTS_WORK=y
|
||||
|
||||
# CONFIG_DMADEVICES_DEBUG is not set
|
||||
# CONFIG_DMADEVICES_VDEBUG is not set
|
||||
CONFIG_DMADEVICES_DEBUG=y
|
||||
CONFIG_DMADEVICES_VDEBUG=y
|
||||
|
||||
CONFIG_PM_ADVANCED_DEBUG=y
|
||||
|
||||
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
|
||||
# CONFIG_QUOTA_DEBUG is not set
|
||||
CONFIG_CEPH_LIB_PRETTYDEBUG=y
|
||||
CONFIG_QUOTA_DEBUG=y
|
||||
|
||||
CONFIG_PCI_DEFAULT_USE_CRS=y
|
||||
|
||||
CONFIG_KGDB_KDB=y
|
||||
CONFIG_KDB_KEYBOARD=y
|
||||
|
||||
# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
|
||||
# CONFIG_TEST_LIST_SORT is not set
|
||||
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
|
||||
CONFIG_TEST_LIST_SORT=y
|
||||
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
|
||||
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
|
||||
|
||||
# CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK is not set
|
||||
CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
|
||||
|
||||
# CONFIG_DEBUG_KMEMLEAK is not set
|
||||
CONFIG_DEBUG_KMEMLEAK=y
|
||||
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=1024
|
||||
# CONFIG_DEBUG_KMEMLEAK_TEST is not set
|
||||
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
|
||||
|
@ -320,7 +320,7 @@ CONFIG_STRICT_DEVMEM=y
|
||||
|
||||
# CONFIG_MEMTEST is not set
|
||||
# CONFIG_DEBUG_TLBFLUSH is not set
|
||||
# CONFIG_MAXSMP is not set
|
||||
CONFIG_MAXSMP=y
|
||||
|
||||
|
||||
CONFIG_HP_ILO=m
|
||||
|
22
kernel.spec
22
kernel.spec
@ -6,7 +6,7 @@ Summary: The Linux kernel
|
||||
# For a stable, released kernel, released_kernel should be 1. For rawhide
|
||||
# and/or a kernel built from an rc or git snapshot, released_kernel should
|
||||
# be 0.
|
||||
%global released_kernel 1
|
||||
%global released_kernel 0
|
||||
|
||||
# Sign modules on x86. Make sure the config files match this setting if more
|
||||
# architectures are added.
|
||||
@ -95,7 +95,7 @@ Summary: The Linux kernel
|
||||
# The rc snapshot level
|
||||
%define rcrev 0
|
||||
# The git snapshot level
|
||||
%define gitrev 0
|
||||
%define gitrev 2
|
||||
# Set rpm version accordingly
|
||||
%define rpmversion 3.%{upstream_sublevel}.0
|
||||
%endif
|
||||
@ -163,7 +163,7 @@ Summary: The Linux kernel
|
||||
# Set debugbuildsenabled to 1 for production (build separate debug kernels)
|
||||
# and 0 for rawhide (all kernels are debug kernels).
|
||||
# See also 'make debug' and 'make release'.
|
||||
%define debugbuildsenabled 1
|
||||
%define debugbuildsenabled 0
|
||||
|
||||
# Want to build a vanilla kernel build without any non-upstream patches?
|
||||
%define with_vanilla %{?_with_vanilla: 1} %{?!_with_vanilla: 0}
|
||||
@ -176,7 +176,7 @@ Summary: The Linux kernel
|
||||
%define doc_build_fail true
|
||||
%endif
|
||||
|
||||
%define rawhide_skip_docs 0
|
||||
%define rawhide_skip_docs 1
|
||||
%if 0%{?rawhide_skip_docs}
|
||||
%define with_doc 0
|
||||
%define doc_build_fail true
|
||||
@ -657,9 +657,6 @@ Patch100: taint-vbox.patch
|
||||
|
||||
Patch110: vmbugon-warnon.patch
|
||||
|
||||
Patch150: team-net-next-20120808.patch
|
||||
Patch151: team-net-next-update-20120927.patch
|
||||
|
||||
Patch390: linux-2.6-defaults-acpi-video.patch
|
||||
Patch391: linux-2.6-acpi-video-dos.patch
|
||||
Patch394: linux-2.6-acpi-debug-infinite-loop.patch
|
||||
@ -729,7 +726,6 @@ Patch14010: lis3-improve-handling-of-null-rate.patch
|
||||
|
||||
# ARM
|
||||
Patch21000: arm-read_current_timer.patch
|
||||
Patch21001: arm-fix-omapdrm.patch
|
||||
Patch21002: arm-fix_radio_shark.patch
|
||||
# OMAP
|
||||
|
||||
@ -1323,9 +1319,6 @@ ApplyPatch taint-vbox.patch
|
||||
|
||||
ApplyPatch vmbugon-warnon.patch
|
||||
|
||||
ApplyPatch team-net-next-20120808.patch
|
||||
ApplyPatch team-net-next-update-20120927.patch
|
||||
|
||||
# Architecture patches
|
||||
# x86(-64)
|
||||
|
||||
@ -1333,7 +1326,6 @@ ApplyPatch team-net-next-update-20120927.patch
|
||||
# ARM
|
||||
#
|
||||
ApplyPatch arm-read_current_timer.patch
|
||||
ApplyPatch arm-fix-omapdrm.patch
|
||||
ApplyPatch arm-fix_radio_shark.patch
|
||||
ApplyPatch arm-tegra-nvec-kconfig.patch
|
||||
ApplyPatch arm-tegra-usb-no-reset-linux33.patch
|
||||
@ -1411,7 +1403,7 @@ ApplyPatch modsign-post-KS-jwb.patch
|
||||
ApplyPatch secure-boot-20120924.patch
|
||||
|
||||
# Improved PCI support for UEFI
|
||||
ApplyPatch handle-efi-roms.patch
|
||||
# ApplyPatch handle-efi-roms.patch
|
||||
|
||||
# Assorted Virt Fixes
|
||||
|
||||
@ -2320,6 +2312,10 @@ fi
|
||||
# ||----w |
|
||||
# || ||
|
||||
%changelog
|
||||
* Fri Oct 05 2012 Justin M. Forbes <jforbes@redhat.com>
|
||||
- v3.6-6670-gecefbd9
|
||||
- Reenable debugging options.
|
||||
|
||||
* Tue Oct 2 2012 Peter Robinson <pbrobinson@fedoraproject.org>
|
||||
- Update ARM configs for 3.6 final
|
||||
- Add highbank SATA driver for stability
|
||||
|
@ -28,14 +28,14 @@ index 2209620..659c1bb 100644
|
||||
quot = uart_get_divisor(port, baud);
|
||||
|
||||
@@ -2240,7 +2251,7 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct uart_8250_port *up = (struct uart_8250_port *)port;
|
||||
container_of(port, struct uart_8250_port, port);
|
||||
unsigned char cval, fcr = 0;
|
||||
unsigned long flags;
|
||||
- unsigned int baud, quot;
|
||||
+ unsigned int baud, quot, max_baud;
|
||||
int fifo_bug = 0;
|
||||
|
||||
switch (termios->c_cflag & CSIZE) {
|
||||
case CS5:
|
||||
@@ -2272,9 +2283,10 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
/*
|
||||
* Ask the core to calculate the divisor for us.
|
||||
|
@ -28,9 +28,9 @@ index 35c67e0..42dce2a 100644
|
||||
-static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
|
||||
+/* LIS3DC: 0 = power off, above 9 = undefined */
|
||||
+static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000, -1, -1, -1, -1, -1, -1};
|
||||
static int lis3_3dlh_rates[4] = {50, 100, 400, 1000};
|
||||
|
||||
/* ODR is Output Data Rate */
|
||||
static int lis3lv02d_get_odr(struct lis3lv02d *lis3)
|
||||
@@ -202,12 +203,11 @@ static int lis3lv02d_get_odr(struct lis3lv02d *lis3)
|
||||
return lis3->odrs[(ctrl >> shift)];
|
||||
}
|
||||
|
@ -1073,6 +1073,7 @@ index 2d5d041..42036c7 100644
|
||||
char *datablob;
|
||||
int ret = 0;
|
||||
int key_cmd;
|
||||
size_t key_len;
|
||||
|
||||
- if (datalen <= 0 || datalen > 32767 || !data)
|
||||
+ if (datalen <= 0 || datalen > 32767 || !prep->data)
|
||||
|
@ -650,39 +650,6 @@ index 93978d5..e3e5f8c 100644
|
||||
1.7.11.4
|
||||
|
||||
|
||||
From 294d339c63b0f67a362efaa62713f26d9f496da8 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Garrett <mjg@redhat.com>
|
||||
Date: Thu, 26 Jul 2012 18:00:00 -0400
|
||||
Subject: [PATCH 13/14] efi: Build EFI stub with EFI-appropriate options
|
||||
|
||||
We can't assume the presence of the red zone while we're still in a boot
|
||||
services environment, so we should build with -fno-red-zone to avoid
|
||||
problems. Change the size of wchar at the same time to make string handling
|
||||
simpler.
|
||||
|
||||
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||
---
|
||||
arch/x86/boot/compressed/Makefile | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
|
||||
index e398bb5..8a84501 100644
|
||||
--- a/arch/x86/boot/compressed/Makefile
|
||||
+++ b/arch/x86/boot/compressed/Makefile
|
||||
@@ -28,6 +28,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
|
||||
$(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \
|
||||
$(obj)/piggy.o
|
||||
|
||||
+$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
|
||||
+$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone
|
||||
+
|
||||
ifeq ($(CONFIG_EFI_STUB), y)
|
||||
VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o
|
||||
endif
|
||||
--
|
||||
1.7.11.4
|
||||
|
||||
|
||||
From d1a225668878a3339adcd7ce0be256e857360ada Mon Sep 17 00:00:00 2001
|
||||
From: Josh Boyer <jwboyer@redhat.com>
|
||||
Date: Tue, 26 Jun 2012 16:27:26 -0400
|
||||
|
1
sources
1
sources
@ -1 +1,2 @@
|
||||
1a1760420eac802c541a20ab51a093d1 linux-3.6.tar.xz
|
||||
b0b56985ea36be2c9aa36530b471d8d5 patch-3.6-git2.xz
|
||||
|
@ -1,499 +0,0 @@
|
||||
Update team driver to latest net-next.
|
||||
|
||||
Split patches available here:
|
||||
http://people.redhat.com/jpirko/f18_team_update_2/
|
||||
|
||||
Jiri Pirko (4):
|
||||
netlink: add signed types
|
||||
team: add signed 32-bit team option type
|
||||
team: add per port priority option
|
||||
team: add support for queue override by setting queue_id for port
|
||||
|
||||
drivers/net/team/team.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
include/linux/if_team.h | 7 ++
|
||||
include/net/netlink.h | 98 +++++++++++++++++++++++
|
||||
3 files changed, 303 insertions(+), 2 deletions(-)
|
||||
|
||||
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
|
||||
|
||||
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
|
||||
index 87707ab..ba10c46 100644
|
||||
--- a/drivers/net/team/team.c
|
||||
+++ b/drivers/net/team/team.c
|
||||
@@ -658,6 +658,122 @@ static rx_handler_result_t team_handle_frame(struct sk_buff **pskb)
|
||||
}
|
||||
|
||||
|
||||
+/*************************************
|
||||
+ * Multiqueue Tx port select override
|
||||
+ *************************************/
|
||||
+
|
||||
+static int team_queue_override_init(struct team *team)
|
||||
+{
|
||||
+ struct list_head *listarr;
|
||||
+ unsigned int queue_cnt = team->dev->num_tx_queues - 1;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ if (!queue_cnt)
|
||||
+ return 0;
|
||||
+ listarr = kmalloc(sizeof(struct list_head) * queue_cnt, GFP_KERNEL);
|
||||
+ if (!listarr)
|
||||
+ return -ENOMEM;
|
||||
+ team->qom_lists = listarr;
|
||||
+ for (i = 0; i < queue_cnt; i++)
|
||||
+ INIT_LIST_HEAD(listarr++);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void team_queue_override_fini(struct team *team)
|
||||
+{
|
||||
+ kfree(team->qom_lists);
|
||||
+}
|
||||
+
|
||||
+static struct list_head *__team_get_qom_list(struct team *team, u16 queue_id)
|
||||
+{
|
||||
+ return &team->qom_lists[queue_id - 1];
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * note: already called with rcu_read_lock
|
||||
+ */
|
||||
+static bool team_queue_override_transmit(struct team *team, struct sk_buff *skb)
|
||||
+{
|
||||
+ struct list_head *qom_list;
|
||||
+ struct team_port *port;
|
||||
+
|
||||
+ if (!team->queue_override_enabled || !skb->queue_mapping)
|
||||
+ return false;
|
||||
+ qom_list = __team_get_qom_list(team, skb->queue_mapping);
|
||||
+ list_for_each_entry_rcu(port, qom_list, qom_list) {
|
||||
+ if (!team_dev_queue_xmit(team, port, skb))
|
||||
+ return true;
|
||||
+ }
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static void __team_queue_override_port_del(struct team *team,
|
||||
+ struct team_port *port)
|
||||
+{
|
||||
+ list_del_rcu(&port->qom_list);
|
||||
+ synchronize_rcu();
|
||||
+ INIT_LIST_HEAD(&port->qom_list);
|
||||
+}
|
||||
+
|
||||
+static bool team_queue_override_port_has_gt_prio_than(struct team_port *port,
|
||||
+ struct team_port *cur)
|
||||
+{
|
||||
+ if (port->priority < cur->priority)
|
||||
+ return true;
|
||||
+ if (port->priority > cur->priority)
|
||||
+ return false;
|
||||
+ if (port->index < cur->index)
|
||||
+ return true;
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static void __team_queue_override_port_add(struct team *team,
|
||||
+ struct team_port *port)
|
||||
+{
|
||||
+ struct team_port *cur;
|
||||
+ struct list_head *qom_list;
|
||||
+ struct list_head *node;
|
||||
+
|
||||
+ if (!port->queue_id || !team_port_enabled(port))
|
||||
+ return;
|
||||
+
|
||||
+ qom_list = __team_get_qom_list(team, port->queue_id);
|
||||
+ node = qom_list;
|
||||
+ list_for_each_entry(cur, qom_list, qom_list) {
|
||||
+ if (team_queue_override_port_has_gt_prio_than(port, cur))
|
||||
+ break;
|
||||
+ node = &cur->qom_list;
|
||||
+ }
|
||||
+ list_add_tail_rcu(&port->qom_list, node);
|
||||
+}
|
||||
+
|
||||
+static void __team_queue_override_enabled_check(struct team *team)
|
||||
+{
|
||||
+ struct team_port *port;
|
||||
+ bool enabled = false;
|
||||
+
|
||||
+ list_for_each_entry(port, &team->port_list, list) {
|
||||
+ if (!list_empty(&port->qom_list)) {
|
||||
+ enabled = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ if (enabled == team->queue_override_enabled)
|
||||
+ return;
|
||||
+ netdev_dbg(team->dev, "%s queue override\n",
|
||||
+ enabled ? "Enabling" : "Disabling");
|
||||
+ team->queue_override_enabled = enabled;
|
||||
+}
|
||||
+
|
||||
+static void team_queue_override_port_refresh(struct team *team,
|
||||
+ struct team_port *port)
|
||||
+{
|
||||
+ __team_queue_override_port_del(team, port);
|
||||
+ __team_queue_override_port_add(team, port);
|
||||
+ __team_queue_override_enabled_check(team);
|
||||
+}
|
||||
+
|
||||
+
|
||||
/****************
|
||||
* Port handling
|
||||
****************/
|
||||
@@ -688,6 +804,7 @@ static void team_port_enable(struct team *team,
|
||||
hlist_add_head_rcu(&port->hlist,
|
||||
team_port_index_hash(team, port->index));
|
||||
team_adjust_ops(team);
|
||||
+ team_queue_override_port_refresh(team, port);
|
||||
if (team->ops.port_enabled)
|
||||
team->ops.port_enabled(team, port);
|
||||
}
|
||||
@@ -716,6 +833,7 @@ static void team_port_disable(struct team *team,
|
||||
hlist_del_rcu(&port->hlist);
|
||||
__reconstruct_port_hlist(team, port->index);
|
||||
port->index = -1;
|
||||
+ team_queue_override_port_refresh(team, port);
|
||||
__team_adjust_ops(team, team->en_port_count - 1);
|
||||
/*
|
||||
* Wait until readers see adjusted ops. This ensures that
|
||||
@@ -881,6 +999,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
|
||||
|
||||
port->dev = port_dev;
|
||||
port->team = team;
|
||||
+ INIT_LIST_HEAD(&port->qom_list);
|
||||
|
||||
port->orig.mtu = port_dev->mtu;
|
||||
err = dev_set_mtu(port_dev, dev->mtu);
|
||||
@@ -1092,6 +1211,49 @@ static int team_user_linkup_en_option_set(struct team *team,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int team_priority_option_get(struct team *team,
|
||||
+ struct team_gsetter_ctx *ctx)
|
||||
+{
|
||||
+ struct team_port *port = ctx->info->port;
|
||||
+
|
||||
+ ctx->data.s32_val = port->priority;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int team_priority_option_set(struct team *team,
|
||||
+ struct team_gsetter_ctx *ctx)
|
||||
+{
|
||||
+ struct team_port *port = ctx->info->port;
|
||||
+
|
||||
+ port->priority = ctx->data.s32_val;
|
||||
+ team_queue_override_port_refresh(team, port);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int team_queue_id_option_get(struct team *team,
|
||||
+ struct team_gsetter_ctx *ctx)
|
||||
+{
|
||||
+ struct team_port *port = ctx->info->port;
|
||||
+
|
||||
+ ctx->data.u32_val = port->queue_id;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int team_queue_id_option_set(struct team *team,
|
||||
+ struct team_gsetter_ctx *ctx)
|
||||
+{
|
||||
+ struct team_port *port = ctx->info->port;
|
||||
+
|
||||
+ if (port->queue_id == ctx->data.u32_val)
|
||||
+ return 0;
|
||||
+ if (ctx->data.u32_val >= team->dev->real_num_tx_queues)
|
||||
+ return -EINVAL;
|
||||
+ port->queue_id = ctx->data.u32_val;
|
||||
+ team_queue_override_port_refresh(team, port);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static const struct team_option team_options[] = {
|
||||
{
|
||||
.name = "mode",
|
||||
@@ -1120,6 +1282,20 @@ static const struct team_option team_options[] = {
|
||||
.getter = team_user_linkup_en_option_get,
|
||||
.setter = team_user_linkup_en_option_set,
|
||||
},
|
||||
+ {
|
||||
+ .name = "priority",
|
||||
+ .type = TEAM_OPTION_TYPE_S32,
|
||||
+ .per_port = true,
|
||||
+ .getter = team_priority_option_get,
|
||||
+ .setter = team_priority_option_set,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "queue_id",
|
||||
+ .type = TEAM_OPTION_TYPE_U32,
|
||||
+ .per_port = true,
|
||||
+ .getter = team_queue_id_option_get,
|
||||
+ .setter = team_queue_id_option_set,
|
||||
+ },
|
||||
};
|
||||
|
||||
static struct lock_class_key team_netdev_xmit_lock_key;
|
||||
@@ -1155,6 +1331,9 @@ static int team_init(struct net_device *dev)
|
||||
for (i = 0; i < TEAM_PORT_HASHENTRIES; i++)
|
||||
INIT_HLIST_HEAD(&team->en_port_hlist[i]);
|
||||
INIT_LIST_HEAD(&team->port_list);
|
||||
+ err = team_queue_override_init(team);
|
||||
+ if (err)
|
||||
+ goto err_team_queue_override_init;
|
||||
|
||||
team_adjust_ops(team);
|
||||
|
||||
@@ -1170,6 +1349,8 @@ static int team_init(struct net_device *dev)
|
||||
return 0;
|
||||
|
||||
err_options_register:
|
||||
+ team_queue_override_fini(team);
|
||||
+err_team_queue_override_init:
|
||||
free_percpu(team->pcpu_stats);
|
||||
|
||||
return err;
|
||||
@@ -1187,6 +1368,7 @@ static void team_uninit(struct net_device *dev)
|
||||
|
||||
__team_change_mode(team, NULL); /* cleanup */
|
||||
__team_options_unregister(team, team_options, ARRAY_SIZE(team_options));
|
||||
+ team_queue_override_fini(team);
|
||||
mutex_unlock(&team->lock);
|
||||
}
|
||||
|
||||
@@ -1216,10 +1398,12 @@ static int team_close(struct net_device *dev)
|
||||
static netdev_tx_t team_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct team *team = netdev_priv(dev);
|
||||
- bool tx_success = false;
|
||||
+ bool tx_success;
|
||||
unsigned int len = skb->len;
|
||||
|
||||
- tx_success = team->ops.transmit(team, skb);
|
||||
+ tx_success = team_queue_override_transmit(team, skb);
|
||||
+ if (!tx_success)
|
||||
+ tx_success = team->ops.transmit(team, skb);
|
||||
if (tx_success) {
|
||||
struct team_pcpu_stats *pcpu_stats;
|
||||
|
||||
@@ -1787,6 +1971,12 @@ static int team_nl_fill_one_option_get(struct sk_buff *skb, struct team *team,
|
||||
nla_put_flag(skb, TEAM_ATTR_OPTION_DATA))
|
||||
goto nest_cancel;
|
||||
break;
|
||||
+ case TEAM_OPTION_TYPE_S32:
|
||||
+ if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_S32))
|
||||
+ goto nest_cancel;
|
||||
+ if (nla_put_s32(skb, TEAM_ATTR_OPTION_DATA, ctx.data.s32_val))
|
||||
+ goto nest_cancel;
|
||||
+ break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
@@ -1975,6 +2165,9 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
|
||||
case NLA_FLAG:
|
||||
opt_type = TEAM_OPTION_TYPE_BOOL;
|
||||
break;
|
||||
+ case NLA_S32:
|
||||
+ opt_type = TEAM_OPTION_TYPE_S32;
|
||||
+ break;
|
||||
default:
|
||||
goto team_put;
|
||||
}
|
||||
@@ -2031,6 +2224,9 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
|
||||
case TEAM_OPTION_TYPE_BOOL:
|
||||
ctx.data.bool_val = attr_data ? true : false;
|
||||
break;
|
||||
+ case TEAM_OPTION_TYPE_S32:
|
||||
+ ctx.data.s32_val = nla_get_s32(attr_data);
|
||||
+ break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
diff --git a/include/linux/if_team.h b/include/linux/if_team.h
|
||||
index 6960fc1..33fcc20 100644
|
||||
--- a/include/linux/if_team.h
|
||||
+++ b/include/linux/if_team.h
|
||||
@@ -67,6 +67,9 @@ struct team_port {
|
||||
struct netpoll *np;
|
||||
#endif
|
||||
|
||||
+ s32 priority; /* lower number ~ higher priority */
|
||||
+ u16 queue_id;
|
||||
+ struct list_head qom_list; /* node in queue override mapping list */
|
||||
long mode_priv[0];
|
||||
};
|
||||
|
||||
@@ -130,6 +133,7 @@ enum team_option_type {
|
||||
TEAM_OPTION_TYPE_STRING,
|
||||
TEAM_OPTION_TYPE_BINARY,
|
||||
TEAM_OPTION_TYPE_BOOL,
|
||||
+ TEAM_OPTION_TYPE_S32,
|
||||
};
|
||||
|
||||
struct team_option_inst_info {
|
||||
@@ -146,6 +150,7 @@ struct team_gsetter_ctx {
|
||||
u32 len;
|
||||
} bin_val;
|
||||
bool bool_val;
|
||||
+ s32 s32_val;
|
||||
} data;
|
||||
struct team_option_inst_info *info;
|
||||
};
|
||||
@@ -197,6 +202,8 @@ struct team {
|
||||
|
||||
const struct team_mode *mode;
|
||||
struct team_mode_ops ops;
|
||||
+ bool queue_override_enabled;
|
||||
+ struct list_head *qom_lists; /* array of queue override mapping lists */
|
||||
long mode_priv[TEAM_MODE_PRIV_LONGS];
|
||||
};
|
||||
|
||||
diff --git a/include/net/netlink.h b/include/net/netlink.h
|
||||
index 785f37a..09175d5 100644
|
||||
--- a/include/net/netlink.h
|
||||
+++ b/include/net/netlink.h
|
||||
@@ -98,6 +98,10 @@
|
||||
* nla_put_u16(skb, type, value) add u16 attribute to skb
|
||||
* nla_put_u32(skb, type, value) add u32 attribute to skb
|
||||
* nla_put_u64(skb, type, value) add u64 attribute to skb
|
||||
+ * nla_put_s8(skb, type, value) add s8 attribute to skb
|
||||
+ * nla_put_s16(skb, type, value) add s16 attribute to skb
|
||||
+ * nla_put_s32(skb, type, value) add s32 attribute to skb
|
||||
+ * nla_put_s64(skb, type, value) add s64 attribute to skb
|
||||
* nla_put_string(skb, type, str) add string attribute to skb
|
||||
* nla_put_flag(skb, type) add flag attribute to skb
|
||||
* nla_put_msecs(skb, type, jiffies) add msecs attribute to skb
|
||||
@@ -121,6 +125,10 @@
|
||||
* nla_get_u16(nla) get payload for a u16 attribute
|
||||
* nla_get_u32(nla) get payload for a u32 attribute
|
||||
* nla_get_u64(nla) get payload for a u64 attribute
|
||||
+ * nla_get_s8(nla) get payload for a s8 attribute
|
||||
+ * nla_get_s16(nla) get payload for a s16 attribute
|
||||
+ * nla_get_s32(nla) get payload for a s32 attribute
|
||||
+ * nla_get_s64(nla) get payload for a s64 attribute
|
||||
* nla_get_flag(nla) return 1 if flag is true
|
||||
* nla_get_msecs(nla) get payload for a msecs attribute
|
||||
*
|
||||
@@ -160,6 +168,10 @@ enum {
|
||||
NLA_NESTED_COMPAT,
|
||||
NLA_NUL_STRING,
|
||||
NLA_BINARY,
|
||||
+ NLA_S8,
|
||||
+ NLA_S16,
|
||||
+ NLA_S32,
|
||||
+ NLA_S64,
|
||||
__NLA_TYPE_MAX,
|
||||
};
|
||||
|
||||
@@ -183,6 +195,8 @@ enum {
|
||||
* NLA_NESTED_COMPAT Minimum length of structure payload
|
||||
* NLA_U8, NLA_U16,
|
||||
* NLA_U32, NLA_U64,
|
||||
+ * NLA_S8, NLA_S16,
|
||||
+ * NLA_S32, NLA_S64,
|
||||
* NLA_MSECS Leaving the length field zero will verify the
|
||||
* given type fits, using it verifies minimum length
|
||||
* just like "All other"
|
||||
@@ -879,6 +893,50 @@ static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * nla_put_s8 - Add a s8 netlink attribute to a socket buffer
|
||||
+ * @skb: socket buffer to add attribute to
|
||||
+ * @attrtype: attribute type
|
||||
+ * @value: numeric value
|
||||
+ */
|
||||
+static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
|
||||
+{
|
||||
+ return nla_put(skb, attrtype, sizeof(s8), &value);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nla_put_s16 - Add a s16 netlink attribute to a socket buffer
|
||||
+ * @skb: socket buffer to add attribute to
|
||||
+ * @attrtype: attribute type
|
||||
+ * @value: numeric value
|
||||
+ */
|
||||
+static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
|
||||
+{
|
||||
+ return nla_put(skb, attrtype, sizeof(s16), &value);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nla_put_s32 - Add a s32 netlink attribute to a socket buffer
|
||||
+ * @skb: socket buffer to add attribute to
|
||||
+ * @attrtype: attribute type
|
||||
+ * @value: numeric value
|
||||
+ */
|
||||
+static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
|
||||
+{
|
||||
+ return nla_put(skb, attrtype, sizeof(s32), &value);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nla_put_s64 - Add a s64 netlink attribute to a socket buffer
|
||||
+ * @skb: socket buffer to add attribute to
|
||||
+ * @attrtype: attribute type
|
||||
+ * @value: numeric value
|
||||
+ */
|
||||
+static inline int nla_put_s64(struct sk_buff *skb, int attrtype, s64 value)
|
||||
+{
|
||||
+ return nla_put(skb, attrtype, sizeof(s64), &value);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* nla_put_string - Add a string netlink attribute to a socket buffer
|
||||
* @skb: socket buffer to add attribute to
|
||||
* @attrtype: attribute type
|
||||
@@ -994,6 +1052,46 @@ static inline __be64 nla_get_be64(const struct nlattr *nla)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * nla_get_s32 - return payload of s32 attribute
|
||||
+ * @nla: s32 netlink attribute
|
||||
+ */
|
||||
+static inline s32 nla_get_s32(const struct nlattr *nla)
|
||||
+{
|
||||
+ return *(s32 *) nla_data(nla);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nla_get_s16 - return payload of s16 attribute
|
||||
+ * @nla: s16 netlink attribute
|
||||
+ */
|
||||
+static inline s16 nla_get_s16(const struct nlattr *nla)
|
||||
+{
|
||||
+ return *(s16 *) nla_data(nla);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nla_get_s8 - return payload of s8 attribute
|
||||
+ * @nla: s8 netlink attribute
|
||||
+ */
|
||||
+static inline s8 nla_get_s8(const struct nlattr *nla)
|
||||
+{
|
||||
+ return *(s8 *) nla_data(nla);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nla_get_s64 - return payload of s64 attribute
|
||||
+ * @nla: s64 netlink attribute
|
||||
+ */
|
||||
+static inline s64 nla_get_s64(const struct nlattr *nla)
|
||||
+{
|
||||
+ s64 tmp;
|
||||
+
|
||||
+ nla_memcpy(&tmp, nla, sizeof(tmp));
|
||||
+
|
||||
+ return tmp;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* nla_get_flag - return payload of flag attribute
|
||||
* @nla: flag netlink attribute
|
||||
*/
|
||||
|
@ -1,335 +0,0 @@
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/drivers/net/team/Kconfig
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/drivers/net/team/Kconfig
|
||||
@@ -21,7 +21,7 @@ config NET_TEAM_MODE_BROADCAST
|
||||
---help---
|
||||
Basic mode where packets are transmitted always by all suitable ports.
|
||||
|
||||
- All added ports are setup to have team's mac address.
|
||||
+ All added ports are setup to have team's device address.
|
||||
|
||||
To compile this team mode as a module, choose M here: the module
|
||||
will be called team_mode_broadcast.
|
||||
@@ -33,7 +33,7 @@ config NET_TEAM_MODE_ROUNDROBIN
|
||||
Basic mode where port used for transmitting packets is selected in
|
||||
round-robin fashion using packet counter.
|
||||
|
||||
- All added ports are setup to have team's mac address.
|
||||
+ All added ports are setup to have team's device address.
|
||||
|
||||
To compile this team mode as a module, choose M here: the module
|
||||
will be called team_mode_roundrobin.
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/drivers/net/team/team.c
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/drivers/net/team/team.c
|
||||
@@ -54,29 +54,29 @@ static struct team_port *team_port_get_r
|
||||
}
|
||||
|
||||
/*
|
||||
- * Since the ability to change mac address for open port device is tested in
|
||||
+ * Since the ability to change device address for open port device is tested in
|
||||
* team_port_add, this function can be called without control of return value
|
||||
*/
|
||||
-static int __set_port_mac(struct net_device *port_dev,
|
||||
- const unsigned char *dev_addr)
|
||||
+static int __set_port_dev_addr(struct net_device *port_dev,
|
||||
+ const unsigned char *dev_addr)
|
||||
{
|
||||
struct sockaddr addr;
|
||||
|
||||
- memcpy(addr.sa_data, dev_addr, ETH_ALEN);
|
||||
- addr.sa_family = ARPHRD_ETHER;
|
||||
+ memcpy(addr.sa_data, dev_addr, port_dev->addr_len);
|
||||
+ addr.sa_family = port_dev->type;
|
||||
return dev_set_mac_address(port_dev, &addr);
|
||||
}
|
||||
|
||||
-static int team_port_set_orig_mac(struct team_port *port)
|
||||
+static int team_port_set_orig_dev_addr(struct team_port *port)
|
||||
{
|
||||
- return __set_port_mac(port->dev, port->orig.dev_addr);
|
||||
+ return __set_port_dev_addr(port->dev, port->orig.dev_addr);
|
||||
}
|
||||
|
||||
-int team_port_set_team_mac(struct team_port *port)
|
||||
+int team_port_set_team_dev_addr(struct team_port *port)
|
||||
{
|
||||
- return __set_port_mac(port->dev, port->team->dev->dev_addr);
|
||||
+ return __set_port_dev_addr(port->dev, port->team->dev->dev_addr);
|
||||
}
|
||||
-EXPORT_SYMBOL(team_port_set_team_mac);
|
||||
+EXPORT_SYMBOL(team_port_set_team_dev_addr);
|
||||
|
||||
static void team_refresh_port_linkup(struct team_port *port)
|
||||
{
|
||||
@@ -967,6 +967,8 @@ static struct netpoll_info *team_netpoll
|
||||
#endif
|
||||
|
||||
static void __team_port_change_port_added(struct team_port *port, bool linkup);
|
||||
+static int team_dev_type_check_change(struct net_device *dev,
|
||||
+ struct net_device *port_dev);
|
||||
|
||||
static int team_port_add(struct team *team, struct net_device *port_dev)
|
||||
{
|
||||
@@ -975,9 +977,8 @@ static int team_port_add(struct team *te
|
||||
char *portname = port_dev->name;
|
||||
int err;
|
||||
|
||||
- if (port_dev->flags & IFF_LOOPBACK ||
|
||||
- port_dev->type != ARPHRD_ETHER) {
|
||||
- netdev_err(dev, "Device %s is of an unsupported type\n",
|
||||
+ if (port_dev->flags & IFF_LOOPBACK) {
|
||||
+ netdev_err(dev, "Device %s is loopback device. Loopback devices can't be added as a team port\n",
|
||||
portname);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -988,6 +989,17 @@ static int team_port_add(struct team *te
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
+ if (port_dev->features & NETIF_F_VLAN_CHALLENGED &&
|
||||
+ vlan_uses_dev(dev)) {
|
||||
+ netdev_err(dev, "Device %s is VLAN challenged and team device has VLAN set up\n",
|
||||
+ portname);
|
||||
+ return -EPERM;
|
||||
+ }
|
||||
+
|
||||
+ err = team_dev_type_check_change(dev, port_dev);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
if (port_dev->flags & IFF_UP) {
|
||||
netdev_err(dev, "Device %s is up. Set it down before adding it as a team port\n",
|
||||
portname);
|
||||
@@ -1010,7 +1022,7 @@ static int team_port_add(struct team *te
|
||||
goto err_set_mtu;
|
||||
}
|
||||
|
||||
- memcpy(port->orig.dev_addr, port_dev->dev_addr, ETH_ALEN);
|
||||
+ memcpy(port->orig.dev_addr, port_dev->dev_addr, port_dev->addr_len);
|
||||
|
||||
err = team_port_enter(team, port);
|
||||
if (err) {
|
||||
@@ -1091,7 +1103,7 @@ err_vids_add:
|
||||
|
||||
err_dev_open:
|
||||
team_port_leave(team, port);
|
||||
- team_port_set_orig_mac(port);
|
||||
+ team_port_set_orig_dev_addr(port);
|
||||
|
||||
err_port_enter:
|
||||
dev_set_mtu(port_dev, port->orig.mtu);
|
||||
@@ -1129,7 +1141,7 @@ static int team_port_del(struct team *te
|
||||
vlan_vids_del_by_dev(port_dev, dev);
|
||||
dev_close(port_dev);
|
||||
team_port_leave(team, port);
|
||||
- team_port_set_orig_mac(port);
|
||||
+ team_port_set_orig_dev_addr(port);
|
||||
dev_set_mtu(port_dev, port->orig.mtu);
|
||||
synchronize_rcu();
|
||||
kfree(port);
|
||||
@@ -1480,17 +1492,18 @@ static void team_set_rx_mode(struct net_
|
||||
|
||||
static int team_set_mac_address(struct net_device *dev, void *p)
|
||||
{
|
||||
+ struct sockaddr *addr = p;
|
||||
struct team *team = netdev_priv(dev);
|
||||
struct team_port *port;
|
||||
- int err;
|
||||
|
||||
- err = eth_mac_addr(dev, p);
|
||||
- if (err)
|
||||
- return err;
|
||||
+ if (dev->type == ARPHRD_ETHER && !is_valid_ether_addr(addr->sa_data))
|
||||
+ return -EADDRNOTAVAIL;
|
||||
+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
||||
+ dev->addr_assign_type &= ~NET_ADDR_RANDOM;
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(port, &team->port_list, list)
|
||||
- if (team->ops.port_change_mac)
|
||||
- team->ops.port_change_mac(team, port);
|
||||
+ if (team->ops.port_change_dev_addr)
|
||||
+ team->ops.port_change_dev_addr(team, port);
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
@@ -1721,6 +1734,45 @@ static const struct net_device_ops team_
|
||||
* rt netlink interface
|
||||
***********************/
|
||||
|
||||
+static void team_setup_by_port(struct net_device *dev,
|
||||
+ struct net_device *port_dev)
|
||||
+{
|
||||
+ dev->header_ops = port_dev->header_ops;
|
||||
+ dev->type = port_dev->type;
|
||||
+ dev->hard_header_len = port_dev->hard_header_len;
|
||||
+ dev->addr_len = port_dev->addr_len;
|
||||
+ dev->mtu = port_dev->mtu;
|
||||
+ memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
|
||||
+ memcpy(dev->dev_addr, port_dev->dev_addr, port_dev->addr_len);
|
||||
+ dev->addr_assign_type &= ~NET_ADDR_RANDOM;
|
||||
+}
|
||||
+
|
||||
+static int team_dev_type_check_change(struct net_device *dev,
|
||||
+ struct net_device *port_dev)
|
||||
+{
|
||||
+ struct team *team = netdev_priv(dev);
|
||||
+ char *portname = port_dev->name;
|
||||
+ int err;
|
||||
+
|
||||
+ if (dev->type == port_dev->type)
|
||||
+ return 0;
|
||||
+ if (!list_empty(&team->port_list)) {
|
||||
+ netdev_err(dev, "Device %s is of different type\n", portname);
|
||||
+ return -EBUSY;
|
||||
+ }
|
||||
+ err = call_netdevice_notifiers(NETDEV_PRE_TYPE_CHANGE, dev);
|
||||
+ err = notifier_to_errno(err);
|
||||
+ if (err) {
|
||||
+ netdev_err(dev, "Refused to change device type\n");
|
||||
+ return err;
|
||||
+ }
|
||||
+ dev_uc_flush(dev);
|
||||
+ dev_mc_flush(dev);
|
||||
+ team_setup_by_port(dev, port_dev);
|
||||
+ call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void team_setup(struct net_device *dev)
|
||||
{
|
||||
ether_setup(dev);
|
||||
@@ -2442,7 +2494,7 @@ static void __team_options_change_check(
|
||||
list_add_tail(&opt_inst->tmp_list, &sel_opt_inst_list);
|
||||
}
|
||||
err = team_nl_send_event_options_get(team, &sel_opt_inst_list);
|
||||
- if (err)
|
||||
+ if (err && err != -ESRCH)
|
||||
netdev_warn(team->dev, "Failed to send options change via netlink (err %d)\n",
|
||||
err);
|
||||
}
|
||||
@@ -2471,9 +2523,9 @@ static void __team_port_change_send(stru
|
||||
|
||||
send_event:
|
||||
err = team_nl_send_event_port_list_get(port->team);
|
||||
- if (err)
|
||||
- netdev_warn(port->team->dev, "Failed to send port change of device %s via netlink\n",
|
||||
- port->dev->name);
|
||||
+ if (err && err != -ESRCH)
|
||||
+ netdev_warn(port->team->dev, "Failed to send port change of device %s via netlink (err %d)\n",
|
||||
+ port->dev->name, err);
|
||||
|
||||
}
|
||||
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/drivers/net/team/team_mode_broadcast.c
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/drivers/net/team/team_mode_broadcast.c
|
||||
@@ -48,18 +48,18 @@ static bool bc_transmit(struct team *tea
|
||||
|
||||
static int bc_port_enter(struct team *team, struct team_port *port)
|
||||
{
|
||||
- return team_port_set_team_mac(port);
|
||||
+ return team_port_set_team_dev_addr(port);
|
||||
}
|
||||
|
||||
-static void bc_port_change_mac(struct team *team, struct team_port *port)
|
||||
+static void bc_port_change_dev_addr(struct team *team, struct team_port *port)
|
||||
{
|
||||
- team_port_set_team_mac(port);
|
||||
+ team_port_set_team_dev_addr(port);
|
||||
}
|
||||
|
||||
static const struct team_mode_ops bc_mode_ops = {
|
||||
.transmit = bc_transmit,
|
||||
.port_enter = bc_port_enter,
|
||||
- .port_change_mac = bc_port_change_mac,
|
||||
+ .port_change_dev_addr = bc_port_change_dev_addr,
|
||||
};
|
||||
|
||||
static const struct team_mode bc_mode = {
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/drivers/net/team/team_mode_roundrobin.c
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/drivers/net/team/team_mode_roundrobin.c
|
||||
@@ -66,18 +66,18 @@ drop:
|
||||
|
||||
static int rr_port_enter(struct team *team, struct team_port *port)
|
||||
{
|
||||
- return team_port_set_team_mac(port);
|
||||
+ return team_port_set_team_dev_addr(port);
|
||||
}
|
||||
|
||||
-static void rr_port_change_mac(struct team *team, struct team_port *port)
|
||||
+static void rr_port_change_dev_addr(struct team *team, struct team_port *port)
|
||||
{
|
||||
- team_port_set_team_mac(port);
|
||||
+ team_port_set_team_dev_addr(port);
|
||||
}
|
||||
|
||||
static const struct team_mode_ops rr_mode_ops = {
|
||||
.transmit = rr_transmit,
|
||||
.port_enter = rr_port_enter,
|
||||
- .port_change_mac = rr_port_change_mac,
|
||||
+ .port_change_dev_addr = rr_port_change_dev_addr,
|
||||
};
|
||||
|
||||
static const struct team_mode rr_mode = {
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/include/linux/if_team.h
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/include/linux/if_team.h
|
||||
@@ -108,7 +108,7 @@ struct team_mode_ops {
|
||||
bool (*transmit)(struct team *team, struct sk_buff *skb);
|
||||
int (*port_enter)(struct team *team, struct team_port *port);
|
||||
void (*port_leave)(struct team *team, struct team_port *port);
|
||||
- void (*port_change_mac)(struct team *team, struct team_port *port);
|
||||
+ void (*port_change_dev_addr)(struct team *team, struct team_port *port);
|
||||
void (*port_enabled)(struct team *team, struct team_port *port);
|
||||
void (*port_disabled)(struct team *team, struct team_port *port);
|
||||
};
|
||||
@@ -238,7 +238,7 @@ static inline struct team_port *team_get
|
||||
return NULL;
|
||||
}
|
||||
|
||||
-extern int team_port_set_team_mac(struct team_port *port);
|
||||
+extern int team_port_set_team_dev_addr(struct team_port *port);
|
||||
extern int team_options_register(struct team *team,
|
||||
const struct team_option *option,
|
||||
size_t option_count);
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/include/linux/if_vlan.h
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/include/linux/if_vlan.h
|
||||
@@ -74,8 +74,6 @@ static inline struct vlan_ethhdr *vlan_e
|
||||
/* found in socket.c */
|
||||
extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *));
|
||||
|
||||
-struct vlan_info;
|
||||
-
|
||||
static inline int is_vlan_dev(struct net_device *dev)
|
||||
{
|
||||
return dev->priv_flags & IFF_802_1Q_VLAN;
|
||||
@@ -101,6 +99,8 @@ extern int vlan_vids_add_by_dev(struct n
|
||||
const struct net_device *by_dev);
|
||||
extern void vlan_vids_del_by_dev(struct net_device *dev,
|
||||
const struct net_device *by_dev);
|
||||
+
|
||||
+extern bool vlan_uses_dev(const struct net_device *dev);
|
||||
#else
|
||||
static inline struct net_device *
|
||||
__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id)
|
||||
@@ -151,6 +151,11 @@ static inline void vlan_vids_del_by_dev(
|
||||
const struct net_device *by_dev)
|
||||
{
|
||||
}
|
||||
+
|
||||
+static inline bool vlan_uses_dev(const struct net_device *dev)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
#endif
|
||||
|
||||
/**
|
||||
--- linux-3.6.0-0.rc7.git2.1.fc18.x86_64.orig/net/8021q/vlan_core.c
|
||||
+++ linux-3.6.0-0.rc7.git2.1.fc18.x86_64/net/8021q/vlan_core.c
|
||||
@@ -368,3 +368,9 @@ void vlan_vids_del_by_dev(struct net_dev
|
||||
vlan_vid_del(dev, vid_info->vid);
|
||||
}
|
||||
EXPORT_SYMBOL(vlan_vids_del_by_dev);
|
||||
+
|
||||
+bool vlan_uses_dev(const struct net_device *dev)
|
||||
+{
|
||||
+ return rtnl_dereference(dev->vlan_info) ? true : false;
|
||||
+}
|
||||
+EXPORT_SYMBOL(vlan_uses_dev);
|
Loading…
Reference in New Issue
Block a user