Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
87135d92
Commit
87135d92
authored
Nov 10, 2008
by
Ingo Molnar
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'v2.6.28-rc4' into x86/cleanups
parents
4fcc50ab
f7160c75
Changes
26
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
833 additions
and
68 deletions
+833
-68
Makefile
Makefile
+1
-1
drivers/cpuidle/cpuidle.c
drivers/cpuidle/cpuidle.c
+3
-1
drivers/mmc/core/bus.c
drivers/mmc/core/bus.c
+1
-2
drivers/mmc/core/core.c
drivers/mmc/core/core.c
+5
-1
drivers/mmc/core/host.c
drivers/mmc/core/host.c
+2
-3
drivers/mmc/core/sdio_bus.c
drivers/mmc/core/sdio_bus.c
+1
-2
drivers/mmc/host/mmc_spi.c
drivers/mmc/host/mmc_spi.c
+1
-1
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.c
+1
-1
drivers/mmc/host/tifm_sd.c
drivers/mmc/host/tifm_sd.c
+8
-8
drivers/regulator/Kconfig
drivers/regulator/Kconfig
+4
-11
drivers/staging/Kconfig
drivers/staging/Kconfig
+1
-1
fs/nfsd/vfs.c
fs/nfsd/vfs.c
+1
-4
include/linux/cnt32_to_63.h
include/linux/cnt32_to_63.h
+16
-6
include/linux/cpumask.h
include/linux/cpumask.h
+557
-2
include/linux/mmc/card.h
include/linux/mmc/card.h
+1
-1
include/linux/mmc/host.h
include/linux/mmc/host.h
+1
-1
include/linux/mmc/sdio_func.h
include/linux/mmc/sdio_func.h
+1
-1
include/linux/smp.h
include/linux/smp.h
+9
-0
include/linux/workqueue.h
include/linux/workqueue.h
+8
-0
include/net/af_unix.h
include/net/af_unix.h
+1
-0
kernel/cpu.c
kernel/cpu.c
+3
-0
kernel/workqueue.c
kernel/workqueue.c
+45
-0
lib/cpumask.c
lib/cpumask.c
+79
-0
net/unix/af_unix.c
net/unix/af_unix.c
+24
-7
net/unix/garbage.c
net/unix/garbage.c
+37
-12
scripts/package/builddeb
scripts/package/builddeb
+22
-2
No files found.
Makefile
View file @
87135d92
VERSION
=
2
PATCHLEVEL
=
6
SUBLEVEL
=
28
EXTRAVERSION
=
-rc
3
EXTRAVERSION
=
-rc
4
NAME
=
Killer Bat of Doom
# *DOCUMENTATION*
...
...
drivers/cpuidle/cpuidle.c
View file @
87135d92
...
...
@@ -65,12 +65,14 @@ static void cpuidle_idle_call(void)
return
;
}
#if 0
/* shows regressions, re-enable for 2.6.29 */
/*
* run any timers that can be run now, at this point
* before calculating the idle duration etc.
*/
hrtimer_peek_ahead_timers();
#endif
/* ask the governor for the next state */
next_state
=
cpuidle_curr_governor
->
select
(
dev
);
if
(
need_resched
())
...
...
drivers/mmc/core/bus.c
View file @
87135d92
...
...
@@ -216,8 +216,7 @@ int mmc_add_card(struct mmc_card *card)
int
ret
;
const
char
*
type
;
snprintf
(
card
->
dev
.
bus_id
,
sizeof
(
card
->
dev
.
bus_id
),
"%s:%04x"
,
mmc_hostname
(
card
->
host
),
card
->
rca
);
dev_set_name
(
&
card
->
dev
,
"%s:%04x"
,
mmc_hostname
(
card
->
host
),
card
->
rca
);
switch
(
card
->
type
)
{
case
MMC_TYPE_MMC
:
...
...
drivers/mmc/core/core.c
View file @
87135d92
...
...
@@ -280,7 +280,11 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card)
(
card
->
host
->
ios
.
clock
/
1000
);
if
(
data
->
flags
&
MMC_DATA_WRITE
)
limit_us
=
250000
;
/*
* The limit is really 250 ms, but that is
* insufficient for some crappy cards.
*/
limit_us
=
300000
;
else
limit_us
=
100000
;
...
...
drivers/mmc/core/host.c
View file @
87135d92
...
...
@@ -73,8 +73,7 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
if
(
err
)
goto
free
;
snprintf
(
host
->
class_dev
.
bus_id
,
BUS_ID_SIZE
,
"mmc%d"
,
host
->
index
);
dev_set_name
(
&
host
->
class_dev
,
"mmc%d"
,
host
->
index
);
host
->
parent
=
dev
;
host
->
class_dev
.
parent
=
dev
;
...
...
@@ -121,7 +120,7 @@ int mmc_add_host(struct mmc_host *host)
WARN_ON
((
host
->
caps
&
MMC_CAP_SDIO_IRQ
)
&&
!
host
->
ops
->
enable_sdio_irq
);
led_trigger_register_simple
(
host
->
class_dev
.
bus_id
,
&
host
->
led
);
led_trigger_register_simple
(
dev_name
(
&
host
->
class_dev
)
,
&
host
->
led
);
err
=
device_add
(
&
host
->
class_dev
);
if
(
err
)
...
...
drivers/mmc/core/sdio_bus.c
View file @
87135d92
...
...
@@ -239,8 +239,7 @@ int sdio_add_func(struct sdio_func *func)
{
int
ret
;
snprintf
(
func
->
dev
.
bus_id
,
sizeof
(
func
->
dev
.
bus_id
),
"%s:%d"
,
mmc_card_id
(
func
->
card
),
func
->
num
);
dev_set_name
(
&
func
->
dev
,
"%s:%d"
,
mmc_card_id
(
func
->
card
),
func
->
num
);
ret
=
device_add
(
&
func
->
dev
);
if
(
ret
==
0
)
...
...
drivers/mmc/host/mmc_spi.c
View file @
87135d92
...
...
@@ -1348,7 +1348,7 @@ static int mmc_spi_probe(struct spi_device *spi)
goto
fail_add_host
;
dev_info
(
&
spi
->
dev
,
"SD/MMC host %s%s%s%s%s
\n
"
,
mmc
->
class_dev
.
bus_id
,
dev_name
(
&
mmc
->
class_dev
)
,
host
->
dma_dev
?
""
:
", no DMA"
,
(
host
->
pdata
&&
host
->
pdata
->
get_ro
)
?
""
:
", no WP"
,
...
...
drivers/mmc/host/sdhci.c
View file @
87135d92
...
...
@@ -1733,7 +1733,7 @@ int sdhci_add_host(struct sdhci_host *host)
mmc_add_host
(
mmc
);
printk
(
KERN_INFO
"%s: SDHCI controller on %s [%s] using %s%s
\n
"
,
mmc_hostname
(
mmc
),
host
->
hw_name
,
mmc_dev
(
mmc
)
->
bus_id
,
mmc_hostname
(
mmc
),
host
->
hw_name
,
dev_name
(
mmc_dev
(
mmc
))
,
(
host
->
flags
&
SDHCI_USE_ADMA
)
?
"A"
:
""
,
(
host
->
flags
&
SDHCI_USE_DMA
)
?
"DMA"
:
"PIO"
);
...
...
drivers/mmc/host/tifm_sd.c
View file @
87135d92
...
...
@@ -632,7 +632,7 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
if
(
host
->
req
)
{
printk
(
KERN_ERR
"%s : unfinished request detected
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
mrq
->
cmd
->
error
=
-
ETIMEDOUT
;
goto
err_out
;
}
...
...
@@ -672,7 +672,7 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
?
PCI_DMA_TODEVICE
:
PCI_DMA_FROMDEVICE
))
{
printk
(
KERN_ERR
"%s : scatterlist map failed
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
mrq
->
cmd
->
error
=
-
ENOMEM
;
goto
err_out
;
}
...
...
@@ -684,7 +684,7 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
:
PCI_DMA_FROMDEVICE
);
if
(
host
->
sg_len
<
1
)
{
printk
(
KERN_ERR
"%s : scatterlist map failed
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
tifm_unmap_sg
(
sock
,
&
host
->
bounce_buf
,
1
,
r_data
->
flags
&
MMC_DATA_WRITE
?
PCI_DMA_TODEVICE
...
...
@@ -748,7 +748,7 @@ static void tifm_sd_end_cmd(unsigned long data)
if
(
!
mrq
)
{
printk
(
KERN_ERR
" %s : no request to complete?
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
spin_unlock_irqrestore
(
&
sock
->
lock
,
flags
);
return
;
}
...
...
@@ -789,7 +789,7 @@ static void tifm_sd_abort(unsigned long data)
printk
(
KERN_ERR
"%s : card failed to respond for a long period of time "
"(%x, %x)
\n
"
,
host
->
dev
->
dev
.
bus_id
,
host
->
req
->
cmd
->
opcode
,
host
->
cmd_flags
);
dev_name
(
&
host
->
dev
->
dev
)
,
host
->
req
->
cmd
->
opcode
,
host
->
cmd_flags
);
tifm_eject
(
host
->
dev
);
}
...
...
@@ -906,7 +906,7 @@ static int tifm_sd_initialize_host(struct tifm_sd *host)
if
(
rc
)
{
printk
(
KERN_ERR
"%s : controller failed to reset
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
return
-
ENODEV
;
}
...
...
@@ -933,7 +933,7 @@ static int tifm_sd_initialize_host(struct tifm_sd *host)
if
(
rc
)
{
printk
(
KERN_ERR
"%s : card not ready - probe failed on initialization
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
return
-
ENODEV
;
}
...
...
@@ -954,7 +954,7 @@ static int tifm_sd_probe(struct tifm_dev *sock)
if
(
!
(
TIFM_SOCK_STATE_OCCUPIED
&
readl
(
sock
->
addr
+
SOCK_PRESENT_STATE
)))
{
printk
(
KERN_WARNING
"%s : card gone, unexpectedly
\n
"
,
sock
->
dev
.
bus_id
);
dev_name
(
&
sock
->
dev
)
);
return
rc
;
}
...
...
drivers/regulator/Kconfig
View file @
87135d92
menu "Voltage and Current regulators"
config REGULATOR
menuconfig REGULATOR
bool "Voltage and Current Regulator Support"
default n
help
...
...
@@ -23,21 +21,20 @@ config REGULATOR
If unsure, say no.
if REGULATOR
config REGULATOR_DEBUG
bool "Regulator debug support"
depends on REGULATOR
help
Say yes here to enable debugging support.
config REGULATOR_FIXED_VOLTAGE
tristate
default n
select REGULATOR
config REGULATOR_VIRTUAL_CONSUMER
tristate "Virtual regulator consumer support"
default n
select REGULATOR
help
This driver provides a virtual consumer for the voltage and
current regulator API which provides sysfs controls for
...
...
@@ -49,7 +46,6 @@ config REGULATOR_VIRTUAL_CONSUMER
config REGULATOR_BQ24022
tristate "TI bq24022 Dual Input 1-Cell Li-Ion Charger IC"
default n
select REGULATOR
help
This driver controls a TI bq24022 Charger attached via
GPIOs. The provided current regulator can enable/disable
...
...
@@ -59,7 +55,6 @@ config REGULATOR_BQ24022
config REGULATOR_WM8350
tristate "Wolfson Microelectroncis WM8350 AudioPlus PMIC"
depends on MFD_WM8350
select REGULATOR
help
This driver provides support for the voltage and current regulators
of the WM8350 AudioPlus PMIC.
...
...
@@ -67,7 +62,6 @@ config REGULATOR_WM8350
config REGULATOR_WM8400
tristate "Wolfson Microelectroncis WM8400 AudioPlus PMIC"
depends on MFD_WM8400
select REGULATOR
help
This driver provides support for the voltage regulators of the
WM8400 AudioPlus PMIC.
...
...
@@ -75,9 +69,8 @@ config REGULATOR_WM8400
config REGULATOR_DA903X
tristate "Support regulators on Dialog Semiconductor DA9030/DA9034 PMIC"
depends on PMIC_DA903X
select REGULATOR
help
Say y here to support the BUCKs and LDOs regulators found on
Dialog Semiconductor DA9030/DA9034 PMIC.
end
menu
end
if
drivers/staging/Kconfig
View file @
87135d92
...
...
@@ -23,7 +23,7 @@ menuconfig STAGING
config STAGING_EXCLUDE_BUILD
bool "Exclude Staging drivers from being built"
bool "Exclude Staging drivers from being built"
if STAGING
default y
---help---
Are you sure you really want to build the staging drivers?
...
...
fs/nfsd/vfs.c
View file @
87135d92
...
...
@@ -1875,11 +1875,11 @@ static int nfsd_buffered_readdir(struct file *file, filldir_t func,
return
-
ENOMEM
;
offset
=
*
offsetp
;
cdp
->
err
=
nfserr_eof
;
/* will be cleared on successful read */
while
(
1
)
{
unsigned
int
reclen
;
cdp
->
err
=
nfserr_eof
;
/* will be cleared on successful read */
buf
.
used
=
0
;
buf
.
full
=
0
;
...
...
@@ -1912,9 +1912,6 @@ static int nfsd_buffered_readdir(struct file *file, filldir_t func,
de
=
(
struct
buffered_dirent
*
)((
char
*
)
de
+
reclen
);
}
offset
=
vfs_llseek
(
file
,
0
,
SEEK_CUR
);
cdp
->
err
=
nfserr_eof
;
if
(
!
buf
.
full
)
break
;
}
done:
...
...
include/linux/cnt32_to_63.h
View file @
87135d92
...
...
@@ -16,6 +16,7 @@
#include <linux/compiler.h>
#include <linux/types.h>
#include <asm/byteorder.h>
#include <asm/system.h>
/* this is used only to give gcc a clue about good code generation */
union
cnt32_to_63
{
...
...
@@ -53,11 +54,19 @@ union cnt32_to_63 {
* needed increment. And any race in updating the value in memory is harmless
* as the same value would simply be stored more than once.
*
* The only restriction for the algorithm to work properly is that this
* code must be executed at least once per each half period of the 32-bit
* counter to properly update the state bit in memory. This is usually not a
* problem in practice, but if it is then a kernel timer could be scheduled
* to manage for this code to be executed often enough.
* The restrictions for the algorithm to work properly are:
*
* 1) this code must be called at least once per each half period of the
* 32-bit counter;
*
* 2) this code must not be preempted for a duration longer than the
* 32-bit counter half period minus the longest period between two
* calls to this code.
*
* Those requirements ensure proper update to the state bit in memory.
* This is usually not a problem in practice, but if it is then a kernel
* timer should be scheduled to manage for this code to be executed often
* enough.
*
* Note that the top bit (bit 63) in the returned value should be considered
* as garbage. It is not cleared here because callers are likely to use a
...
...
@@ -68,9 +77,10 @@ union cnt32_to_63 {
*/
#define cnt32_to_63(cnt_lo) \
({ \
static
volatile
u32 __m_cnt_hi; \
static u32 __m_cnt_hi; \
union cnt32_to_63 __x; \
__x.hi = __m_cnt_hi; \
smp_rmb(); \
__x.lo = (cnt_lo); \
if (unlikely((s32)(__x.hi ^ __x.lo) < 0)) \
__m_cnt_hi = __x.hi = (__x.hi ^ 0x80000000) + (__x.hi >> 31); \
...
...
include/linux/cpumask.h
View file @
87135d92
This diff is collapsed.
Click to expand it.
include/linux/mmc/card.h
View file @
87135d92
...
...
@@ -130,7 +130,7 @@ struct mmc_card {
#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
#define mmc_card_name(c) ((c)->cid.prod_name)
#define mmc_card_id(c) (
(c)->dev.bus_id
)
#define mmc_card_id(c) (
dev_name(&(c)->dev)
)
#define mmc_list_to_card(l) container_of(l, struct mmc_card, node)
#define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev)
...
...
include/linux/mmc/host.h
View file @
87135d92
...
...
@@ -176,7 +176,7 @@ static inline void *mmc_priv(struct mmc_host *host)
#define mmc_dev(x) ((x)->parent)
#define mmc_classdev(x) (&(x)->class_dev)
#define mmc_hostname(x) (
(x)->class_dev.bus_id
)
#define mmc_hostname(x) (
dev_name(&(x)->class_dev)
)
extern
int
mmc_suspend_host
(
struct
mmc_host
*
,
pm_message_t
);
extern
int
mmc_resume_host
(
struct
mmc_host
*
);
...
...
include/linux/mmc/sdio_func.h
View file @
87135d92
...
...
@@ -63,7 +63,7 @@ struct sdio_func {
#define sdio_func_set_present(f) ((f)->state |= SDIO_STATE_PRESENT)
#define sdio_func_id(f) (
(f)->dev.bus_id
)
#define sdio_func_id(f) (
dev_name(&(f)->dev)
)
#define sdio_get_drvdata(f) dev_get_drvdata(&(f)->dev)
#define sdio_set_drvdata(f,d) dev_set_drvdata(&(f)->dev, d)
...
...
include/linux/smp.h
View file @
87135d92
...
...
@@ -64,8 +64,17 @@ extern void smp_cpus_done(unsigned int max_cpus);
* Call a function on all other processors
*/
int
smp_call_function
(
void
(
*
func
)(
void
*
info
),
void
*
info
,
int
wait
);
/* Deprecated: use smp_call_function_many() which uses a cpumask ptr. */
int
smp_call_function_mask
(
cpumask_t
mask
,
void
(
*
func
)(
void
*
info
),
void
*
info
,
int
wait
);
static
inline
void
smp_call_function_many
(
const
struct
cpumask
*
mask
,
void
(
*
func
)(
void
*
info
),
void
*
info
,
int
wait
)
{
smp_call_function_mask
(
*
mask
,
func
,
info
,
wait
);
}
int
smp_call_function_single
(
int
cpuid
,
void
(
*
func
)
(
void
*
info
),
void
*
info
,
int
wait
);
void
__smp_call_function_single
(
int
cpuid
,
struct
call_single_data
*
data
);
...
...
include/linux/workqueue.h
View file @
87135d92
...
...
@@ -240,4 +240,12 @@ void cancel_rearming_delayed_work(struct delayed_work *work)
cancel_delayed_work_sync
(
work
);
}
#ifndef CONFIG_SMP
static
inline
long
work_on_cpu
(
unsigned
int
cpu
,
long
(
*
fn
)(
void
*
),
void
*
arg
)
{
return
fn
(
arg
);
}
#else
long
work_on_cpu
(
unsigned
int
cpu
,
long
(
*
fn
)(
void
*
),
void
*
arg
);
#endif
/* CONFIG_SMP */
#endif
include/net/af_unix.h
View file @
87135d92
...
...
@@ -54,6 +54,7 @@ struct unix_sock {
atomic_long_t
inflight
;
spinlock_t
lock
;
unsigned
int
gc_candidate
:
1
;
unsigned
int
gc_maybe_cycle
:
1
;
wait_queue_head_t
peer_wait
;
};
#define unix_sk(__sk) ((struct unix_sock *)__sk)
...
...
kernel/cpu.c
View file @
87135d92
...
...
@@ -499,3 +499,6 @@ const unsigned long cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)] = {
#endif
};
EXPORT_SYMBOL_GPL
(
cpu_bit_bitmap
);
const
DECLARE_BITMAP
(
cpu_all_bits
,
NR_CPUS
)
=
CPU_BITS_ALL
;
EXPORT_SYMBOL
(
cpu_all_bits
);
kernel/workqueue.c
View file @
87135d92
...
...
@@ -970,6 +970,51 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,
return
ret
;
}
#ifdef CONFIG_SMP
struct
work_for_cpu
{
struct
work_struct
work
;
long
(
*
fn
)(
void
*
);
void
*
arg
;
long
ret
;
};
static
void
do_work_for_cpu
(
struct
work_struct
*
w
)
{
struct
work_for_cpu
*
wfc
=
container_of
(
w
,
struct
work_for_cpu
,
work
);
wfc
->
ret
=
wfc
->
fn
(
wfc
->
arg
);
}
/**
* work_on_cpu - run a function in user context on a particular cpu
* @cpu: the cpu to run on
* @fn: the function to run
* @arg: the function arg
*
* This will return -EINVAL in the cpu is not online, or the return value
* of @fn otherwise.
*/
long
work_on_cpu
(
unsigned
int
cpu
,
long
(
*
fn
)(
void
*
),
void
*
arg
)
{
struct
work_for_cpu
wfc
;
INIT_WORK
(
&
wfc
.
work
,
do_work_for_cpu
);
wfc
.
fn
=
fn
;
wfc
.
arg
=
arg
;
get_online_cpus
();
if
(
unlikely
(
!
cpu_online
(
cpu
)))
wfc
.
ret
=
-
EINVAL
;
else
{
schedule_work_on
(
cpu
,
&
wfc
.
work
);
flush_work
(
&
wfc
.
work
);
}
put_online_cpus
();
return
wfc
.
ret
;
}
EXPORT_SYMBOL_GPL
(
work_on_cpu
);
#endif
/* CONFIG_SMP */
void
__init
init_workqueues
(
void
)
{
cpu_populated_map
=
cpu_online_map
;
...
...
lib/cpumask.c
View file @
87135d92
...
...
@@ -2,6 +2,7 @@
#include <linux/bitops.h>
#include <linux/cpumask.h>
#include <linux/module.h>
#include <linux/bootmem.h>
int
__first_cpu
(
const
cpumask_t
*
srcp
)
{
...
...
@@ -35,3 +36,81 @@ int __any_online_cpu(const cpumask_t *mask)
return
cpu
;
}
EXPORT_SYMBOL
(
__any_online_cpu
);
/**
* cpumask_next_and - get the next cpu in *src1p & *src2p
* @n: the cpu prior to the place to search (ie. return will be > @n)
* @src1p: the first cpumask pointer
* @src2p: the second cpumask pointer
*
* Returns >= nr_cpu_ids if no further cpus set in both.
*/
int
cpumask_next_and
(
int
n
,
const
struct
cpumask
*
src1p
,
const
struct
cpumask
*
src2p
)
{
while
((
n
=
cpumask_next
(
n
,
src1p
))
<
nr_cpu_ids
)
if
(
cpumask_test_cpu
(
n
,
src2p
))
break
;
return
n
;
}
EXPORT_SYMBOL
(
cpumask_next_and
);
/**
* cpumask_any_but - return a "random" in a cpumask, but not this one.
* @mask: the cpumask to search
* @cpu: the cpu to ignore.
*
* Often used to find any cpu but smp_processor_id() in a mask.
* Returns >= nr_cpu_ids if no cpus set.
*/
int
cpumask_any_but
(
const
struct
cpumask
*
mask
,
unsigned
int
cpu
)
{
unsigned
int
i
;
cpumask_check
(
cpu
);
for_each_cpu
(
i
,
mask
)
if
(
i
!=
cpu
)
break
;
return
i
;
}
/* These are not inline because of header tangles. */
#ifdef CONFIG_CPUMASK_OFFSTACK
bool
alloc_cpumask_var
(
cpumask_var_t
*
mask
,
gfp_t
flags
)
{
if
(
likely
(
slab_is_available
()))
*
mask
=
kmalloc
(
cpumask_size
(),
flags
);
else
{
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
printk
(
KERN_ERR
"=> alloc_cpumask_var: kmalloc not available!
\n
"
);
dump_stack
();
#endif
*
mask
=
NULL
;
}
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
if
(
!*
mask
)
{
printk
(
KERN_ERR
"=> alloc_cpumask_var: failed!
\n
"
);
dump_stack
();
}
#endif
return
*
mask
!=
NULL
;
}
EXPORT_SYMBOL
(
alloc_cpumask_var
);
void
__init
alloc_bootmem_cpumask_var
(
cpumask_var_t
*
mask
)
{
*
mask
=
alloc_bootmem
(
cpumask_size
());
}
void
free_cpumask_var
(
cpumask_var_t
mask
)
{
kfree
(
mask
);
}
EXPORT_SYMBOL
(
free_cpumask_var
);
void
__init
free_bootmem_cpumask_var
(
cpumask_var_t
mask
)
{
free_bootmem
((
unsigned
long
)
mask
,
cpumask_size
());
}
#endif
net/unix/af_unix.c
View file @
87135d92
...
...
@@ -1302,14 +1302,23 @@ static void unix_destruct_fds(struct sk_buff *skb)
sock_wfree
(
skb
);
}
static
void
unix_attach_fds
(
struct
scm_cookie
*
scm
,
struct
sk_buff
*
skb
)
static
int
unix_attach_fds
(
struct
scm_cookie
*
scm
,
struct
sk_buff
*
skb
)
{
int
i
;
/*
* Need to duplicate file references for the sake of garbage
* collection. Otherwise a socket in the fps might become a
* candidate for GC while the skb is not yet queued.
*/
UNIXCB
(
skb
).
fp
=
scm_fp_dup
(
scm
->
fp
);
if
(
!
UNIXCB
(
skb
).
fp
)
return
-
ENOMEM
;
for
(
i
=
scm
->
fp
->
count
-
1
;
i
>=
0
;
i
--
)
unix_inflight
(
scm
->
fp
->
fp
[
i
]);
UNIXCB
(
skb
).
fp
=
scm
->
fp
;
skb
->
destructor
=
unix_destruct_fds
;
scm
->
fp
=
NULL
;
return
0
;
}
/*
...
...
@@ -1368,8 +1377,11 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
goto
out
;
memcpy
(
UNIXCREDS
(
skb
),
&
siocb
->
scm
->
creds
,
sizeof
(
struct
ucred
));
if
(
siocb
->
scm
->
fp
)
unix_attach_fds
(
siocb
->
scm
,
skb
);
if
(
siocb
->
scm
->
fp
)
{
err
=
unix_attach_fds
(
siocb
->
scm
,
skb
);
if
(
err
)
goto
out_free
;
}
unix_get_secdata
(
siocb
->
scm
,
skb
);
skb_reset_transport_header
(
skb
);
...
...
@@ -1538,8 +1550,13 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
size
=
min_t
(
int
,
size
,
skb_tailroom
(
skb
));
memcpy
(
UNIXCREDS
(
skb
),
&
siocb
->
scm
->
creds
,
sizeof
(
struct
ucred
));
if
(
siocb
->
scm
->
fp
)
unix_attach_fds
(
siocb
->
scm
,
skb
);
if
(
siocb
->
scm
->
fp
)
{
err
=
unix_attach_fds
(
siocb
->
scm
,
skb
);
if
(
err
)
{
kfree_skb
(
skb
);
goto
out_err
;
}
}
if
((
err
=
memcpy_fromiovec
(
skb_put
(
skb
,
size
),
msg
->
msg_iov
,
size
))
!=
0
)
{
kfree_skb
(
skb
);
...
...
net/unix/garbage.c
View file @
87135d92
...
...
@@ -186,8 +186,17 @@ static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *),
*/
struct
sock
*
sk
=
unix_get_socket
(
*
fp
++
);
if
(
sk
)
{
hit
=
true
;
func
(
unix_sk
(
sk
));
struct
unix_sock
*
u
=
unix_sk
(
sk
);
/*
* Ignore non-candidates, they could
* have been added to the queues after
* starting the garbage collection
*/
if
(
u
->
gc_candidate
)
{
hit
=
true
;
func
(
u
);
}
}
}
if
(
hit
&&
hitlist
!=
NULL
)
{
...
...
@@ -249,11 +258,11 @@ static void inc_inflight_move_tail(struct unix_sock *u)
{
atomic_long_inc
(
&
u
->
inflight
);
/*
* If this
is still a candidate, move it to the end of the
*
list, so that it's checked even if it was already passed
* over
* If this
still might be part of a cycle, move it to the end
*
of the list, so that it's checked even if it was already
*
passed
over
*/
if
(
u
->
gc_
candidat
e
)
if
(
u
->
gc_
maybe_cycl
e
)
list_move_tail
(
&
u
->
link
,
&
gc_candidates
);
}
...
...
@@ -267,6 +276,7 @@ void unix_gc(void)
struct
unix_sock
*
next
;
struct
sk_buff_head
hitlist
;
struct
list_head
cursor
;
LIST_HEAD
(
not_cycle_list
);
spin_lock
(
&
unix_gc_lock
);
...
...
@@ -282,10 +292,14 @@ void unix_gc(void)
*
* Holding unix_gc_lock will protect these candidates from
* being detached, and hence from gaining an external
* reference. This also means, that since there are no
* possible receivers, the receive queues of these sockets are
* static during the GC, even though the dequeue is done
* before the detach without atomicity guarantees.
* reference. Since there are no possible receivers, all
* buffers currently on the candidates' queues stay there
* during the garbage collection.
*
* We also know that no new candidate can be added onto the
* receive queues. Other, non candidate sockets _can_ be
* added to queue, so we must make sure only to touch
* candidates.
*/
list_for_each_entry_safe
(
u
,
next
,
&
gc_inflight_list
,
link
)
{
long
total_refs
;
...
...
@@ -299,6 +313,7 @@ void unix_gc(void)
if
(
total_refs
==
inflight_refs
)
{
list_move_tail
(
&
u
->
link
,
&
gc_candidates
);
u
->
gc_candidate
=
1
;
u
->
gc_maybe_cycle
=
1
;
}
}
...
...
@@ -325,13 +340,23 @@ void unix_gc(void)
list_move
(
&
cursor
,
&
u
->
link
);
if
(
atomic_long_read
(
&
u
->
inflight
)
>
0
)
{
list_move_tail
(
&
u
->
link
,
&
gc_inflight
_list
);
u
->
gc_
candidat
e
=
0
;
list_move_tail
(
&
u
->
link
,
&
not_cycle
_list
);
u
->
gc_
maybe_cycl
e
=
0
;
scan_children
(
&
u
->
sk
,
inc_inflight_move_tail
,
NULL
);
}
}
list_del
(
&
cursor
);
/*
* not_cycle_list contains those sockets which do not make up a
* cycle. Restore these to the inflight list.
*/
while
(
!
list_empty
(
&
not_cycle_list
))
{
u
=
list_entry
(
not_cycle_list
.
next
,
struct
unix_sock
,
link
);
u
->
gc_candidate
=
0
;
list_move_tail
(
&
u
->
link
,
&
gc_inflight_list
);
}
/*
* Now gc_candidates contains only garbage. Restore original
* inflight counters for these as well, and remove the skbuffs
...
...
scripts/package/builddeb
View file @
87135d92
...
...
@@ -15,15 +15,18 @@ set -e
version
=
$KERNELRELEASE
revision
=
`
cat
.version
`
tmpdir
=
"
$objtree
/debian/tmp"
fwdir
=
"
$objtree
/debian/fwtmp"
packagename
=
linux-
$version
fwpackagename
=
linux-firmware-image
if
[
"
$ARCH
"
==
"um"
]
;
then
packagename
=
user-mode-linux-
$version
fi
# Setup the directory structure
rm
-rf
"
$tmpdir
"
rm
-rf
"
$tmpdir
"
"
$fwdir
"
mkdir
-p
"
$tmpdir
/DEBIAN"
"
$tmpdir
/lib"
"
$tmpdir
/boot"
mkdir
-p
"
$fwdir
/DEBIAN"
"
$fwdir
/lib"
if
[
"
$ARCH
"
==
"um"
]
;
then
mkdir
-p
"
$tmpdir
/usr/lib/uml/modules/
$version
"
"
$tmpdir
/usr/share/doc/
$packagename
"
"
$tmpdir
/usr/bin"
fi
...
...
@@ -107,6 +110,7 @@ Standards-Version: 3.6.1
Package:
$packagename
Provides: kernel-image-
$version
, linux-image-
$version
Suggests:
$fwpackagename
Architecture: any
Description: Linux kernel, version
$version
This package contains the Linux kernel, modules and corresponding other
...
...
@@ -118,8 +122,24 @@ fi
chown
-R
root:root
"
$tmpdir
"
chmod
-R
go-w
"
$tmpdir
"
# Do we have firmware? Move it out of the way and build it into a package.
if
[
-e
"
$tmpdir
/lib/firmware"
]
;
then
mv
"
$tmpdir
/lib/firmware"
"
$fwdir
/lib/"
cat
<<
EOF
>> debian/control
Package:
$fwpackagename
Architecture: all
Description: Linux kernel firmware, version
$version
This package contains firmware from the Linux kernel, version
$version
EOF
dpkg-gencontrol
-isp
-p
$fwpackagename
-P
"
$fwdir
"
dpkg
--build
"
$fwdir
"
..
fi
# Perform the final magic
dpkg-gencontrol
-isp
dpkg-gencontrol
-isp
-p
$packagename
dpkg
--build
"
$tmpdir
"
..
exit
0
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment