diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/netdevice.h | 4 | ||||
| -rw-r--r-- | include/linux/netfilter/nfnetlink_conntrack.h | 1 | ||||
| -rw-r--r-- | include/linux/netfilter/x_tables.h | 73 | ||||
| -rw-r--r-- | include/linux/wait.h | 6 | ||||
| -rw-r--r-- | include/net/bluetooth/hci.h | 1 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_core.h | 8 |
6 files changed, 81 insertions, 12 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 2e7783f4a755..5a96a1a406e9 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -104,7 +104,7 @@ struct wireless_dev; | |||
| 104 | # else | 104 | # else |
| 105 | # define LL_MAX_HEADER 96 | 105 | # define LL_MAX_HEADER 96 |
| 106 | # endif | 106 | # endif |
| 107 | #elif defined(CONFIG_TR) | 107 | #elif defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) |
| 108 | # define LL_MAX_HEADER 48 | 108 | # define LL_MAX_HEADER 48 |
| 109 | #else | 109 | #else |
| 110 | # define LL_MAX_HEADER 32 | 110 | # define LL_MAX_HEADER 32 |
| @@ -500,7 +500,7 @@ struct netdev_queue { | |||
| 500 | * | 500 | * |
| 501 | * int (*ndo_set_mac_address)(struct net_device *dev, void *addr); | 501 | * int (*ndo_set_mac_address)(struct net_device *dev, void *addr); |
| 502 | * This function is called when the Media Access Control address | 502 | * This function is called when the Media Access Control address |
| 503 | * needs to be changed. If not this interface is not defined, the | 503 | * needs to be changed. If this interface is not defined, the |
| 504 | * mac address can not be changed. | 504 | * mac address can not be changed. |
| 505 | * | 505 | * |
| 506 | * int (*ndo_validate_addr)(struct net_device *dev); | 506 | * int (*ndo_validate_addr)(struct net_device *dev); |
diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index 29fe9ea1d346..1a865e48b8eb 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h | |||
| @@ -100,6 +100,7 @@ enum ctattr_protoinfo_tcp { | |||
| 100 | enum ctattr_protoinfo_dccp { | 100 | enum ctattr_protoinfo_dccp { |
| 101 | CTA_PROTOINFO_DCCP_UNSPEC, | 101 | CTA_PROTOINFO_DCCP_UNSPEC, |
| 102 | CTA_PROTOINFO_DCCP_STATE, | 102 | CTA_PROTOINFO_DCCP_STATE, |
| 103 | CTA_PROTOINFO_DCCP_ROLE, | ||
| 103 | __CTA_PROTOINFO_DCCP_MAX, | 104 | __CTA_PROTOINFO_DCCP_MAX, |
| 104 | }; | 105 | }; |
| 105 | #define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1) | 106 | #define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1) |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 7b1a652066c0..1b2e43502ef7 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -354,9 +354,6 @@ struct xt_table | |||
| 354 | /* What hooks you will enter on */ | 354 | /* What hooks you will enter on */ |
| 355 | unsigned int valid_hooks; | 355 | unsigned int valid_hooks; |
| 356 | 356 | ||
| 357 | /* Lock for the curtain */ | ||
| 358 | struct mutex lock; | ||
| 359 | |||
| 360 | /* Man behind the curtain... */ | 357 | /* Man behind the curtain... */ |
| 361 | struct xt_table_info *private; | 358 | struct xt_table_info *private; |
| 362 | 359 | ||
| @@ -434,8 +431,74 @@ extern void xt_proto_fini(struct net *net, u_int8_t af); | |||
| 434 | 431 | ||
| 435 | extern struct xt_table_info *xt_alloc_table_info(unsigned int size); | 432 | extern struct xt_table_info *xt_alloc_table_info(unsigned int size); |
| 436 | extern void xt_free_table_info(struct xt_table_info *info); | 433 | extern void xt_free_table_info(struct xt_table_info *info); |
| 437 | extern void xt_table_entry_swap_rcu(struct xt_table_info *old, | 434 | |
| 438 | struct xt_table_info *new); | 435 | /* |
| 436 | * Per-CPU spinlock associated with per-cpu table entries, and | ||
| 437 | * with a counter for the "reading" side that allows a recursive | ||
| 438 | * reader to avoid taking the lock and deadlocking. | ||
| 439 | * | ||
| 440 | * "reading" is used by ip/arp/ip6 tables rule processing which runs per-cpu. | ||
| 441 | * It needs to ensure that the rules are not being changed while the packet | ||
| 442 | * is being processed. In some cases, the read lock will be acquired | ||
| 443 | * twice on the same CPU; this is okay because of the count. | ||
| 444 | * | ||
| 445 | * "writing" is used when reading counters. | ||
| 446 | * During replace any readers that are using the old tables have to complete | ||
| 447 | * before freeing the old table. This is handled by the write locking | ||
| 448 | * necessary for reading the counters. | ||
| 449 | */ | ||
| 450 | struct xt_info_lock { | ||
| 451 | spinlock_t lock; | ||
| 452 | unsigned char readers; | ||
| 453 | }; | ||
| 454 | DECLARE_PER_CPU(struct xt_info_lock, xt_info_locks); | ||
| 455 | |||
| 456 | /* | ||
| 457 | * Note: we need to ensure that preemption is disabled before acquiring | ||
| 458 | * the per-cpu-variable, so we do it as a two step process rather than | ||
| 459 | * using "spin_lock_bh()". | ||
| 460 | * | ||
| 461 | * We _also_ need to disable bottom half processing before updating our | ||
| 462 | * nesting count, to make sure that the only kind of re-entrancy is this | ||
| 463 | * code being called by itself: since the count+lock is not an atomic | ||
| 464 | * operation, we can allow no races. | ||
| 465 | * | ||
| 466 | * _Only_ that special combination of being per-cpu and never getting | ||
| 467 | * re-entered asynchronously means that the count is safe. | ||
| 468 | */ | ||
| 469 | static inline void xt_info_rdlock_bh(void) | ||
| 470 | { | ||
| 471 | struct xt_info_lock *lock; | ||
| 472 | |||
| 473 | local_bh_disable(); | ||
| 474 | lock = &__get_cpu_var(xt_info_locks); | ||
| 475 | if (!lock->readers++) | ||
| 476 | spin_lock(&lock->lock); | ||
| 477 | } | ||
| 478 | |||
| 479 | static inline void xt_info_rdunlock_bh(void) | ||
| 480 | { | ||
| 481 | struct xt_info_lock *lock = &__get_cpu_var(xt_info_locks); | ||
| 482 | |||
| 483 | if (!--lock->readers) | ||
| 484 | spin_unlock(&lock->lock); | ||
| 485 | local_bh_enable(); | ||
| 486 | } | ||
| 487 | |||
| 488 | /* | ||
| 489 | * The "writer" side needs to get exclusive access to the lock, | ||
| 490 | * regardless of readers. This must be called with bottom half | ||
| 491 | * processing (and thus also preemption) disabled. | ||
| 492 | */ | ||
| 493 | static inline void xt_info_wrlock(unsigned int cpu) | ||
| 494 | { | ||
| 495 | spin_lock(&per_cpu(xt_info_locks, cpu).lock); | ||
| 496 | } | ||
| 497 | |||
| 498 | static inline void xt_info_wrunlock(unsigned int cpu) | ||
| 499 | { | ||
| 500 | spin_unlock(&per_cpu(xt_info_locks, cpu).lock); | ||
| 501 | } | ||
| 439 | 502 | ||
| 440 | /* | 503 | /* |
| 441 | * This helper is performance critical and must be inlined | 504 | * This helper is performance critical and must be inlined |
diff --git a/include/linux/wait.h b/include/linux/wait.h index 5d631c17eaee..bc024632f365 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
| @@ -440,13 +440,15 @@ void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait, | |||
| 440 | int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); | 440 | int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); |
| 441 | int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); | 441 | int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); |
| 442 | 442 | ||
| 443 | #define DEFINE_WAIT(name) \ | 443 | #define DEFINE_WAIT_FUNC(name, function) \ |
| 444 | wait_queue_t name = { \ | 444 | wait_queue_t name = { \ |
| 445 | .private = current, \ | 445 | .private = current, \ |
| 446 | .func = autoremove_wake_function, \ | 446 | .func = function, \ |
| 447 | .task_list = LIST_HEAD_INIT((name).task_list), \ | 447 | .task_list = LIST_HEAD_INIT((name).task_list), \ |
| 448 | } | 448 | } |
| 449 | 449 | ||
| 450 | #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, autoremove_wake_function) | ||
| 451 | |||
| 450 | #define DEFINE_WAIT_BIT(name, word, bit) \ | 452 | #define DEFINE_WAIT_BIT(name, word, bit) \ |
| 451 | struct wait_bit_queue name = { \ | 453 | struct wait_bit_queue name = { \ |
| 452 | .key = __WAIT_BIT_KEY_INITIALIZER(word, bit), \ | 454 | .key = __WAIT_BIT_KEY_INITIALIZER(word, bit), \ |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index f69f015bbcc0..ed3aea1605e8 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
| @@ -101,6 +101,7 @@ enum { | |||
| 101 | /* HCI timeouts */ | 101 | /* HCI timeouts */ |
| 102 | #define HCI_CONNECT_TIMEOUT (40000) /* 40 seconds */ | 102 | #define HCI_CONNECT_TIMEOUT (40000) /* 40 seconds */ |
| 103 | #define HCI_DISCONN_TIMEOUT (2000) /* 2 seconds */ | 103 | #define HCI_DISCONN_TIMEOUT (2000) /* 2 seconds */ |
| 104 | #define HCI_PAIRING_TIMEOUT (60000) /* 60 seconds */ | ||
| 104 | #define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ | 105 | #define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ |
| 105 | #define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ | 106 | #define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ |
| 106 | 107 | ||
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 01f9316b4c23..be5bd713d2c9 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -171,6 +171,7 @@ struct hci_conn { | |||
| 171 | __u8 auth_type; | 171 | __u8 auth_type; |
| 172 | __u8 sec_level; | 172 | __u8 sec_level; |
| 173 | __u8 power_save; | 173 | __u8 power_save; |
| 174 | __u16 disc_timeout; | ||
| 174 | unsigned long pend; | 175 | unsigned long pend; |
| 175 | 176 | ||
| 176 | unsigned int sent; | 177 | unsigned int sent; |
| @@ -180,7 +181,8 @@ struct hci_conn { | |||
| 180 | struct timer_list disc_timer; | 181 | struct timer_list disc_timer; |
| 181 | struct timer_list idle_timer; | 182 | struct timer_list idle_timer; |
| 182 | 183 | ||
| 183 | struct work_struct work; | 184 | struct work_struct work_add; |
| 185 | struct work_struct work_del; | ||
| 184 | 186 | ||
| 185 | struct device dev; | 187 | struct device dev; |
| 186 | 188 | ||
| @@ -348,9 +350,9 @@ static inline void hci_conn_put(struct hci_conn *conn) | |||
| 348 | if (conn->type == ACL_LINK) { | 350 | if (conn->type == ACL_LINK) { |
| 349 | del_timer(&conn->idle_timer); | 351 | del_timer(&conn->idle_timer); |
| 350 | if (conn->state == BT_CONNECTED) { | 352 | if (conn->state == BT_CONNECTED) { |
| 351 | timeo = msecs_to_jiffies(HCI_DISCONN_TIMEOUT); | 353 | timeo = msecs_to_jiffies(conn->disc_timeout); |
| 352 | if (!conn->out) | 354 | if (!conn->out) |
| 353 | timeo *= 5; | 355 | timeo *= 2; |
| 354 | } else | 356 | } else |
| 355 | timeo = msecs_to_jiffies(10); | 357 | timeo = msecs_to_jiffies(10); |
| 356 | } else | 358 | } else |
