mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
Merge tag 'v5.19-rc2' into android-mainline
Linux 5.19-rc2 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic779cc646d8cddea65010ea1959888a69cea274b
This commit is contained in:
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = Superb Owl
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -85,7 +85,7 @@ config NVSW_SN2201
|
||||
depends on I2C
|
||||
depends on REGMAP_I2C
|
||||
help
|
||||
This driver provides support for the Nvidia SN2201 platfom.
|
||||
This driver provides support for the Nvidia SN2201 platform.
|
||||
The SN2201 is a highly integrated for one rack unit system with
|
||||
L3 management switches. It has 48 x 1Gbps RJ45 + 4 x 100G QSFP28
|
||||
ports in a compact 1RU form factor. The system also including a
|
||||
|
||||
@@ -326,7 +326,7 @@ static struct resource nvsw_sn2201_lpc_res[] = {
|
||||
};
|
||||
|
||||
/* SN2201 I2C platform data. */
|
||||
struct mlxreg_core_hotplug_platform_data nvsw_sn2201_i2c_data = {
|
||||
static struct mlxreg_core_hotplug_platform_data nvsw_sn2201_i2c_data = {
|
||||
.irq = NVSW_SN2201_CPLD_SYSIRQ,
|
||||
};
|
||||
|
||||
|
||||
@@ -405,11 +405,14 @@ MODULE_DEVICE_TABLE(dmi, dmi_ids);
|
||||
static int __init p50_module_init(void)
|
||||
{
|
||||
struct resource res = DEFINE_RES_IO(P50_GPIO_IO_PORT_BASE, P50_PORT_CMD + 1);
|
||||
int ret;
|
||||
|
||||
if (!dmi_first_match(dmi_ids))
|
||||
return -ENODEV;
|
||||
|
||||
platform_driver_register(&p50_gpio_driver);
|
||||
ret = platform_driver_register(&p50_gpio_driver);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
gpio_pdev = platform_device_register_simple(DRIVER_NAME, PLATFORM_DEVID_NONE, &res, 1);
|
||||
if (IS_ERR(gpio_pdev)) {
|
||||
|
||||
@@ -140,6 +140,7 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev)
|
||||
}}
|
||||
|
||||
static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B450M DS3H-CF"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B450M S2H V2"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE AX V2"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE"),
|
||||
@@ -156,6 +157,7 @@ static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 GAMING X"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 I AORUS PRO WIFI"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 UD"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("Z690M AORUS ELITE AX DDR4"),
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
|
||||
#define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"
|
||||
#define HPWMI_BIOS_GUID "5FB7F034-2C63-45e9-BE91-3D44E2C707E4"
|
||||
#define HP_OMEN_EC_THERMAL_PROFILE_OFFSET 0x95
|
||||
#define zero_if_sup(tmp) (zero_insize_support?0:sizeof(tmp)) // use when zero insize is required
|
||||
|
||||
/* DMI board names of devices that should use the omen specific path for
|
||||
* thermal profiles.
|
||||
@@ -220,6 +221,7 @@ static struct input_dev *hp_wmi_input_dev;
|
||||
static struct platform_device *hp_wmi_platform_dev;
|
||||
static struct platform_profile_handler platform_profile_handler;
|
||||
static bool platform_profile_support;
|
||||
static bool zero_insize_support;
|
||||
|
||||
static struct rfkill *wifi_rfkill;
|
||||
static struct rfkill *bluetooth_rfkill;
|
||||
@@ -290,14 +292,16 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command,
|
||||
struct bios_return *bios_return;
|
||||
union acpi_object *obj = NULL;
|
||||
struct bios_args *args = NULL;
|
||||
int mid, actual_outsize, ret;
|
||||
int mid, actual_insize, actual_outsize;
|
||||
size_t bios_args_size;
|
||||
int ret;
|
||||
|
||||
mid = encode_outsize_for_pvsz(outsize);
|
||||
if (WARN_ON(mid < 0))
|
||||
return mid;
|
||||
|
||||
bios_args_size = struct_size(args, data, insize);
|
||||
actual_insize = max(insize, 128);
|
||||
bios_args_size = struct_size(args, data, actual_insize);
|
||||
args = kmalloc(bios_args_size, GFP_KERNEL);
|
||||
if (!args)
|
||||
return -ENOMEM;
|
||||
@@ -374,7 +378,7 @@ static int hp_wmi_read_int(int query)
|
||||
int val = 0, ret;
|
||||
|
||||
ret = hp_wmi_perform_query(query, HPWMI_READ, &val,
|
||||
0, sizeof(val));
|
||||
zero_if_sup(val), sizeof(val));
|
||||
|
||||
if (ret)
|
||||
return ret < 0 ? ret : -EINVAL;
|
||||
@@ -410,7 +414,8 @@ static int hp_wmi_get_tablet_mode(void)
|
||||
return -ENODEV;
|
||||
|
||||
ret = hp_wmi_perform_query(HPWMI_SYSTEM_DEVICE_MODE, HPWMI_READ,
|
||||
system_device_mode, 0, sizeof(system_device_mode));
|
||||
system_device_mode, zero_if_sup(system_device_mode),
|
||||
sizeof(system_device_mode));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -497,7 +502,7 @@ static int hp_wmi_fan_speed_max_get(void)
|
||||
int val = 0, ret;
|
||||
|
||||
ret = hp_wmi_perform_query(HPWMI_FAN_SPEED_MAX_GET_QUERY, HPWMI_GM,
|
||||
&val, 0, sizeof(val));
|
||||
&val, zero_if_sup(val), sizeof(val));
|
||||
|
||||
if (ret)
|
||||
return ret < 0 ? ret : -EINVAL;
|
||||
@@ -509,7 +514,7 @@ static int __init hp_wmi_bios_2008_later(void)
|
||||
{
|
||||
int state = 0;
|
||||
int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, HPWMI_READ, &state,
|
||||
0, sizeof(state));
|
||||
zero_if_sup(state), sizeof(state));
|
||||
if (!ret)
|
||||
return 1;
|
||||
|
||||
@@ -520,7 +525,7 @@ static int __init hp_wmi_bios_2009_later(void)
|
||||
{
|
||||
u8 state[128];
|
||||
int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, HPWMI_READ, &state,
|
||||
0, sizeof(state));
|
||||
zero_if_sup(state), sizeof(state));
|
||||
if (!ret)
|
||||
return 1;
|
||||
|
||||
@@ -598,7 +603,7 @@ static int hp_wmi_rfkill2_refresh(void)
|
||||
int err, i;
|
||||
|
||||
err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state,
|
||||
0, sizeof(state));
|
||||
zero_if_sup(state), sizeof(state));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -1007,7 +1012,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device)
|
||||
int err, i;
|
||||
|
||||
err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state,
|
||||
0, sizeof(state));
|
||||
zero_if_sup(state), sizeof(state));
|
||||
if (err)
|
||||
return err < 0 ? err : -EINVAL;
|
||||
|
||||
@@ -1483,11 +1488,15 @@ static int __init hp_wmi_init(void)
|
||||
{
|
||||
int event_capable = wmi_has_guid(HPWMI_EVENT_GUID);
|
||||
int bios_capable = wmi_has_guid(HPWMI_BIOS_GUID);
|
||||
int err;
|
||||
int err, tmp = 0;
|
||||
|
||||
if (!bios_capable && !event_capable)
|
||||
return -ENODEV;
|
||||
|
||||
if (hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, HPWMI_READ, &tmp,
|
||||
sizeof(tmp), sizeof(tmp)) == HPWMI_RET_INVALID_PARAMETERS)
|
||||
zero_insize_support = true;
|
||||
|
||||
if (event_capable) {
|
||||
err = hp_wmi_input_setup();
|
||||
if (err)
|
||||
|
||||
@@ -122,6 +122,12 @@ static const struct dmi_system_id dmi_vgbs_allow_list[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Spectre x360 Convertible 15-df0xxx"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Surface Go"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -1912,6 +1912,7 @@ static const struct x86_cpu_id intel_pmc_core_ids[] = {
|
||||
X86_MATCH_INTEL_FAM6_MODEL(ROCKETLAKE, &tgl_reg_map),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_L, &tgl_reg_map),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE, &adl_reg_map),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_P, &tgl_reg_map),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -282,7 +282,7 @@ static int pmt_crashlog_probe(struct auxiliary_device *auxdev,
|
||||
auxiliary_set_drvdata(auxdev, priv);
|
||||
|
||||
for (i = 0; i < intel_vsec_dev->num_resources; i++) {
|
||||
struct intel_pmt_entry *entry = &priv->entry[i].entry;
|
||||
struct intel_pmt_entry *entry = &priv->entry[priv->num_entries].entry;
|
||||
|
||||
ret = intel_pmt_dev_create(entry, &pmt_crashlog_ns, intel_vsec_dev, i);
|
||||
if (ret < 0)
|
||||
|
||||
@@ -1086,7 +1086,7 @@ struct file_system_type cifs_fs_type = {
|
||||
};
|
||||
MODULE_ALIAS_FS("cifs");
|
||||
|
||||
static struct file_system_type smb3_fs_type = {
|
||||
struct file_system_type smb3_fs_type = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "smb3",
|
||||
.init_fs_context = smb3_init_fs_context,
|
||||
|
||||
@@ -38,7 +38,7 @@ static inline unsigned long cifs_get_time(struct dentry *dentry)
|
||||
return (unsigned long) dentry->d_fsdata;
|
||||
}
|
||||
|
||||
extern struct file_system_type cifs_fs_type;
|
||||
extern struct file_system_type cifs_fs_type, smb3_fs_type;
|
||||
extern const struct address_space_operations cifs_addr_ops;
|
||||
extern const struct address_space_operations cifs_addr_ops_smallbuf;
|
||||
|
||||
|
||||
@@ -97,6 +97,10 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
|
||||
if (!server->hostname)
|
||||
return -EINVAL;
|
||||
|
||||
/* if server hostname isn't populated, there's nothing to do here */
|
||||
if (server->hostname[0] == '\0')
|
||||
return 0;
|
||||
|
||||
len = strlen(server->hostname) + 3;
|
||||
|
||||
unc = kmalloc(len, GFP_KERNEL);
|
||||
|
||||
@@ -1211,18 +1211,23 @@ static struct super_block *__cifs_get_super(void (*f)(struct super_block *, void
|
||||
.data = data,
|
||||
.sb = NULL,
|
||||
};
|
||||
struct file_system_type **fs_type = (struct file_system_type *[]) {
|
||||
&cifs_fs_type, &smb3_fs_type, NULL,
|
||||
};
|
||||
|
||||
iterate_supers_type(&cifs_fs_type, f, &sd);
|
||||
|
||||
if (!sd.sb)
|
||||
return ERR_PTR(-EINVAL);
|
||||
/*
|
||||
* Grab an active reference in order to prevent automounts (DFS links)
|
||||
* of expiring and then freeing up our cifs superblock pointer while
|
||||
* we're doing failover.
|
||||
*/
|
||||
cifs_sb_active(sd.sb);
|
||||
return sd.sb;
|
||||
for (; *fs_type; fs_type++) {
|
||||
iterate_supers_type(*fs_type, f, &sd);
|
||||
if (sd.sb) {
|
||||
/*
|
||||
* Grab an active reference in order to prevent automounts (DFS links)
|
||||
* of expiring and then freeing up our cifs superblock pointer while
|
||||
* we're doing failover.
|
||||
*/
|
||||
cifs_sb_active(sd.sb);
|
||||
return sd.sb;
|
||||
}
|
||||
}
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static void __cifs_put_super(struct super_block *sb)
|
||||
|
||||
@@ -301,7 +301,10 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
||||
/* Auth */
|
||||
ctx.domainauto = ses->domainAuto;
|
||||
ctx.domainname = ses->domainName;
|
||||
ctx.server_hostname = ses->server->hostname;
|
||||
|
||||
/* no hostname for extra channels */
|
||||
ctx.server_hostname = "";
|
||||
|
||||
ctx.username = ses->user_name;
|
||||
ctx.password = ses->password;
|
||||
ctx.sectype = ses->sectype;
|
||||
|
||||
@@ -288,6 +288,9 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
|
||||
mutex_unlock(&ses->session_mutex);
|
||||
rc = -EHOSTDOWN;
|
||||
goto failed;
|
||||
} else if (rc) {
|
||||
mutex_unlock(&ses->session_mutex);
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
mutex_unlock(&ses->session_mutex);
|
||||
|
||||
@@ -406,7 +406,7 @@ alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...);
|
||||
* alloc_ordered_workqueue - allocate an ordered workqueue
|
||||
* @fmt: printf format for the name of the workqueue
|
||||
* @flags: WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful)
|
||||
* @args...: args for @fmt
|
||||
* @args: args for @fmt
|
||||
*
|
||||
* Allocate an ordered workqueue. An ordered workqueue executes at
|
||||
* most one work item at any given time in the queued order. They are
|
||||
@@ -445,7 +445,7 @@ extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
||||
struct delayed_work *dwork, unsigned long delay);
|
||||
extern bool queue_rcu_work(struct workqueue_struct *wq, struct rcu_work *rwork);
|
||||
|
||||
extern void flush_workqueue(struct workqueue_struct *wq);
|
||||
extern void __flush_workqueue(struct workqueue_struct *wq);
|
||||
extern void drain_workqueue(struct workqueue_struct *wq);
|
||||
|
||||
extern int schedule_on_each_cpu(work_func_t func);
|
||||
@@ -563,15 +563,23 @@ static inline bool schedule_work(struct work_struct *work)
|
||||
return queue_work(system_wq, work);
|
||||
}
|
||||
|
||||
/*
|
||||
* Detect attempt to flush system-wide workqueues at compile time when possible.
|
||||
*
|
||||
* See https://lkml.kernel.org/r/49925af7-78a8-a3dd-bce6-cfc02e1a9236@I-love.SAKURA.ne.jp
|
||||
* for reasons and steps for converting system-wide workqueues into local workqueues.
|
||||
*/
|
||||
extern void __warn_flushing_systemwide_wq(void)
|
||||
__compiletime_warning("Please avoid flushing system-wide workqueues.");
|
||||
|
||||
/**
|
||||
* flush_scheduled_work - ensure that any scheduled work has run to completion.
|
||||
*
|
||||
* Forces execution of the kernel-global workqueue and blocks until its
|
||||
* completion.
|
||||
*
|
||||
* Think twice before calling this function! It's very easy to get into
|
||||
* trouble if you don't take great care. Either of the following situations
|
||||
* will lead to deadlock:
|
||||
* It's very easy to get into trouble if you don't take great care.
|
||||
* Either of the following situations will lead to deadlock:
|
||||
*
|
||||
* One of the work items currently on the workqueue needs to acquire
|
||||
* a lock held by your code or its caller.
|
||||
@@ -586,11 +594,51 @@ static inline bool schedule_work(struct work_struct *work)
|
||||
* need to know that a particular work item isn't queued and isn't running.
|
||||
* In such cases you should use cancel_delayed_work_sync() or
|
||||
* cancel_work_sync() instead.
|
||||
*
|
||||
* Please stop calling this function! A conversion to stop flushing system-wide
|
||||
* workqueues is in progress. This function will be removed after all in-tree
|
||||
* users stopped calling this function.
|
||||
*/
|
||||
static inline void flush_scheduled_work(void)
|
||||
{
|
||||
flush_workqueue(system_wq);
|
||||
}
|
||||
/*
|
||||
* The background of commit 771c035372a036f8 ("deprecate the
|
||||
* '__deprecated' attribute warnings entirely and for good") is that,
|
||||
* since Linus builds all modules between every single pull he does,
|
||||
* the standard kernel build needs to be _clean_ in order to be able to
|
||||
* notice when new problems happen. Therefore, don't emit warning while
|
||||
* there are in-tree users.
|
||||
*/
|
||||
#define flush_scheduled_work() \
|
||||
({ \
|
||||
if (0) \
|
||||
__warn_flushing_systemwide_wq(); \
|
||||
__flush_workqueue(system_wq); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Although there is no longer in-tree caller, for now just emit warning
|
||||
* in order to give out-of-tree callers time to update.
|
||||
*/
|
||||
#define flush_workqueue(wq) \
|
||||
({ \
|
||||
struct workqueue_struct *_wq = (wq); \
|
||||
\
|
||||
if ((__builtin_constant_p(_wq == system_wq) && \
|
||||
_wq == system_wq) || \
|
||||
(__builtin_constant_p(_wq == system_highpri_wq) && \
|
||||
_wq == system_highpri_wq) || \
|
||||
(__builtin_constant_p(_wq == system_long_wq) && \
|
||||
_wq == system_long_wq) || \
|
||||
(__builtin_constant_p(_wq == system_unbound_wq) && \
|
||||
_wq == system_unbound_wq) || \
|
||||
(__builtin_constant_p(_wq == system_freezable_wq) && \
|
||||
_wq == system_freezable_wq) || \
|
||||
(__builtin_constant_p(_wq == system_power_efficient_wq) && \
|
||||
_wq == system_power_efficient_wq) || \
|
||||
(__builtin_constant_p(_wq == system_freezable_power_efficient_wq) && \
|
||||
_wq == system_freezable_power_efficient_wq)) \
|
||||
__warn_flushing_systemwide_wq(); \
|
||||
__flush_workqueue(_wq); \
|
||||
})
|
||||
|
||||
/**
|
||||
* schedule_delayed_work_on - queue work in global workqueue on CPU after delay
|
||||
|
||||
@@ -22,7 +22,7 @@ struct pool_workqueue;
|
||||
*/
|
||||
TRACE_EVENT(workqueue_queue_work,
|
||||
|
||||
TP_PROTO(unsigned int req_cpu, struct pool_workqueue *pwq,
|
||||
TP_PROTO(int req_cpu, struct pool_workqueue *pwq,
|
||||
struct work_struct *work),
|
||||
|
||||
TP_ARGS(req_cpu, pwq, work),
|
||||
@@ -31,8 +31,8 @@ TRACE_EVENT(workqueue_queue_work,
|
||||
__field( void *, work )
|
||||
__field( void *, function)
|
||||
__string( workqueue, pwq->wq->name)
|
||||
__field( unsigned int, req_cpu )
|
||||
__field( unsigned int, cpu )
|
||||
__field( int, req_cpu )
|
||||
__field( int, cpu )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
@@ -43,7 +43,7 @@ TRACE_EVENT(workqueue_queue_work,
|
||||
__entry->cpu = pwq->pool->cpu;
|
||||
),
|
||||
|
||||
TP_printk("work struct=%p function=%ps workqueue=%s req_cpu=%u cpu=%u",
|
||||
TP_printk("work struct=%p function=%ps workqueue=%s req_cpu=%d cpu=%d",
|
||||
__entry->work, __entry->function, __get_str(workqueue),
|
||||
__entry->req_cpu, __entry->cpu)
|
||||
);
|
||||
|
||||
@@ -2792,13 +2792,13 @@ static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq,
|
||||
}
|
||||
|
||||
/**
|
||||
* flush_workqueue - ensure that any scheduled work has run to completion.
|
||||
* __flush_workqueue - ensure that any scheduled work has run to completion.
|
||||
* @wq: workqueue to flush
|
||||
*
|
||||
* This function sleeps until all work items which were queued on entry
|
||||
* have finished execution, but it is not livelocked by new incoming ones.
|
||||
*/
|
||||
void flush_workqueue(struct workqueue_struct *wq)
|
||||
void __flush_workqueue(struct workqueue_struct *wq)
|
||||
{
|
||||
struct wq_flusher this_flusher = {
|
||||
.list = LIST_HEAD_INIT(this_flusher.list),
|
||||
@@ -2947,7 +2947,7 @@ void flush_workqueue(struct workqueue_struct *wq)
|
||||
out_unlock:
|
||||
mutex_unlock(&wq->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(flush_workqueue);
|
||||
EXPORT_SYMBOL(__flush_workqueue);
|
||||
|
||||
/**
|
||||
* drain_workqueue - drain a workqueue
|
||||
@@ -2975,7 +2975,7 @@ void drain_workqueue(struct workqueue_struct *wq)
|
||||
wq->flags |= __WQ_DRAINING;
|
||||
mutex_unlock(&wq->mutex);
|
||||
reflush:
|
||||
flush_workqueue(wq);
|
||||
__flush_workqueue(wq);
|
||||
|
||||
mutex_lock(&wq->mutex);
|
||||
|
||||
@@ -6116,3 +6116,11 @@ void __init workqueue_init(void)
|
||||
wq_online = true;
|
||||
wq_watchdog_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* Despite the naming, this is a no-op function which is here only for avoiding
|
||||
* link error. Since compile-time warning may fail to catch, we will need to
|
||||
* emit run-time warning from __flush_workqueue().
|
||||
*/
|
||||
void __warn_flushing_systemwide_wq(void) { }
|
||||
EXPORT_SYMBOL(__warn_flushing_systemwide_wq);
|
||||
|
||||
@@ -251,8 +251,8 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
|
||||
|
||||
# To make this rule robust against "Argument list too long" error,
|
||||
# ensure to add $(obj)/ prefix by a shell command.
|
||||
cmd_mod = echo $(call real-search, $*.o, .o, -objs -y -m) | \
|
||||
$(AWK) -v RS='( |\n)' '!x[$$0]++ { print("$(obj)/"$$0) }' > $@
|
||||
cmd_mod = printf '%s\n' $(call real-search, $*.o, .o, -objs -y -m) | \
|
||||
$(AWK) '!x[$$0]++ { print("$(obj)/"$$0) }' > $@
|
||||
|
||||
$(obj)/%.mod: FORCE
|
||||
$(call if_changed,mod)
|
||||
|
||||
@@ -24,9 +24,9 @@ class LxConfigDump(gdb.Command):
|
||||
filename = arg
|
||||
|
||||
try:
|
||||
py_config_ptr = gdb.parse_and_eval("kernel_config_data + 8")
|
||||
py_config_size = gdb.parse_and_eval(
|
||||
"sizeof(kernel_config_data) - 1 - 8 * 2")
|
||||
py_config_ptr = gdb.parse_and_eval("&kernel_config_data")
|
||||
py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end")
|
||||
py_config_size = py_config_ptr_end - py_config_ptr
|
||||
except gdb.error as e:
|
||||
raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?")
|
||||
|
||||
|
||||
@@ -34,9 +34,8 @@ generate_deps() {
|
||||
local mod=${1%.ko:}
|
||||
shift
|
||||
local namespaces="$*"
|
||||
local mod_source_files="`cat $mod.mod | sed -n 1p \
|
||||
| sed -e 's/\.o/\.c/g' \
|
||||
| sed "s|[^ ]* *|${src_prefix}&|g"`"
|
||||
local mod_source_files=$(sed "s|^\(.*\)\.o$|${src_prefix}\1.c|" $mod.mod)
|
||||
|
||||
for ns in $namespaces; do
|
||||
echo "Adding namespace $ns to module $mod.ko."
|
||||
generate_deps_for_ns $ns "$mod_source_files"
|
||||
|
||||
Reference in New Issue
Block a user