[prev in list] [next in list] [prev in thread] [next in thread]
List: lustre-cvs
Subject: [lustre-cvs] b_devel: lustre/portals/libcfs lwt.c Makefile.am debug.c module.c
From: Eric Barton <eeb () moraine ! clusterfs ! com>
Date: 2003-09-30 9:26:11
[Download RAW message or body]
Update of /cvsroot/lustre/lustre/portals/libcfs
In directory moraine.clusterfs.com:/tmp/cvs-serv28387/portals/libcfs
Modified Files:
Tag: b_devel
Makefile.am debug.c module.c
Added Files:
Tag: b_devel
lwt.c
Log Message:
* Merged HEAD diffs
--- NEW FILE ---
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
* Copyright (C) 2003 Cluster File Systems, Inc.
* Author: Eric Barton <eeb@clusterfs.com>
*
* This file is part of Lustre, http://www.lustre.org.
*
* Lustre is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation.
*
* Lustre is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Lustre; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define EXPORT_SYMTAB
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kmod.h>
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/stat.h>
#include <linux/errno.h>
#include <linux/smp_lock.h>
#include <linux/unistd.h>
#include <linux/interrupt.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#define DEBUG_SUBSYSTEM S_PORTALS
#include <linux/kp30.h>
#if LWT_SUPPORT
#define LWT_MEMORY (1<<20) /* 1Mb of trace memory */
#define LWT_MAX_CPUS 4
int lwt_enabled;
int lwt_pages_per_cpu;
lwt_cpu_t lwt_cpus[LWT_MAX_CPUS];
/* NB only root is allowed to retrieve LWT info; it's an open door into the
* kernel... */
int
lwt_lookup_string (int *size, char *knl_ptr,
char *user_ptr, int user_size)
{
/* knl_ptr was retrieved from an LWT snapshot and the caller wants to
* turn it into a string. NB we can crash with an access violation
* trying to determine the string length, so we're trusting our
* caller... */
if (!capable(CAP_SYS_ADMIN))
return (-EPERM);
*size = strlen (knl_ptr) + 1;
if (user_ptr != NULL &&
copy_to_user (user_ptr, knl_ptr, *size))
return (-EFAULT);
return (0);
}
int
lwt_control (int enable, int clear)
{
lwt_page_t *p;
int i;
int j;
if (!capable(CAP_SYS_ADMIN))
return (-EPERM);
if (clear)
for (i = 0; i < num_online_cpus(); i++) {
p = lwt_cpus[i].lwtc_current_page;
for (j = 0; j < lwt_pages_per_cpu; j++) {
memset (p->lwtp_events, 0, PAGE_SIZE);
p = list_entry (p->lwtp_list.next,
lwt_page_t, lwtp_list);
}
}
lwt_enabled = enable;
mb();
if (!enable) {
/* give people some time to stop adding traces */
schedule_timeout(10);
}
return (0);
}
int
lwt_snapshot (int *ncpu, int *total_size,
void *user_ptr, int user_size)
{
const int events_per_page = PAGE_SIZE / sizeof(lwt_event_t);
const int bytes_per_page = events_per_page * sizeof(lwt_event_t);
lwt_page_t *p;
int i;
int j;
if (!capable(CAP_SYS_ADMIN))
return (-EPERM);
*ncpu = num_online_cpus();
*total_size = num_online_cpus() * lwt_pages_per_cpu * bytes_per_page;
if (user_ptr == NULL)
return (0);
for (i = 0; i < num_online_cpus(); i++) {
p = lwt_cpus[i].lwtc_current_page;
for (j = 0; j < lwt_pages_per_cpu; j++) {
if (copy_to_user(user_ptr, p->lwtp_events,
bytes_per_page))
return (-EFAULT);
user_ptr = ((char *)user_ptr) + bytes_per_page;
p = list_entry(p->lwtp_list.next,
lwt_page_t, lwtp_list);
}
}
return (0);
}
int
lwt_init ()
{
int i;
int j;
if (num_online_cpus() > LWT_MAX_CPUS) {
CERROR ("Too many CPUs\n");
return (-EINVAL);
}
/* NULL pointers, zero scalars */
memset (lwt_cpus, 0, sizeof (lwt_cpus));
lwt_pages_per_cpu = LWT_MEMORY / (num_online_cpus() * PAGE_SIZE);
for (i = 0; i < num_online_cpus(); i++)
for (j = 0; j < lwt_pages_per_cpu; j++) {
struct page *page = alloc_page (GFP_KERNEL);
lwt_page_t *lwtp;
if (page == NULL) {
CERROR ("Can't allocate page\n");
lwt_fini ();
return (-ENOMEM);
}
PORTAL_ALLOC(lwtp, sizeof (*lwtp));
if (lwtp == NULL) {
CERROR ("Can't allocate lwtp\n");
__free_page(page);
lwt_fini ();
return (-ENOMEM);
}
lwtp->lwtp_page = page;
lwtp->lwtp_events = page_address(page);
memset (lwtp->lwtp_events, 0, PAGE_SIZE);
if (j == 0) {
INIT_LIST_HEAD (&lwtp->lwtp_list);
lwt_cpus[i].lwtc_current_page = lwtp;
} else {
list_add (&lwtp->lwtp_list,
&lwt_cpus[i].lwtc_current_page->lwtp_list);
}
}
lwt_enabled = 1;
mb();
return (0);
}
void
lwt_fini ()
{
int i;
if (num_online_cpus() > LWT_MAX_CPUS)
return;
for (i = 0; i < num_online_cpus(); i++)
while (lwt_cpus[i].lwtc_current_page != NULL) {
lwt_page_t *lwtp = lwt_cpus[i].lwtc_current_page;
if (list_empty (&lwtp->lwtp_list)) {
lwt_cpus[i].lwtc_current_page = NULL;
} else {
lwt_cpus[i].lwtc_current_page =
list_entry (lwtp->lwtp_list.next,
lwt_page_t, lwtp_list);
list_del (&lwtp->lwtp_list);
}
__free_page (lwtp->lwtp_page);
PORTAL_FREE (lwtp, sizeof (*lwtp));
}
}
EXPORT_SYMBOL(lwt_enabled);
EXPORT_SYMBOL(lwt_cpus);
EXPORT_SYMBOL(lwt_init);
EXPORT_SYMBOL(lwt_fini);
EXPORT_SYMBOL(lwt_lookup_string);
EXPORT_SYMBOL(lwt_control);
EXPORT_SYMBOL(lwt_snapshot);
#endif
Index: Makefile.am
===================================================================
RCS file: /cvsroot/lustre/lustre/portals/libcfs/Makefile.am,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -w -b -B -p -r1.1.2.2 -r1.1.2.3
--- Makefile.am 19 May 2003 06:46:11 -0000 1.1.2.2
+++ Makefile.am 30 Sep 2003 09:26:06 -0000 1.1.2.3
@@ -20,7 +20,7 @@ link-stamp:
echo timestamp > link-stamp
DEFS =
-portals_SOURCES = $(LINKS) module.c proc.c debug.c
+portals_SOURCES = $(LINKS) module.c proc.c debug.c lwt.c
# Don't distribute any patched files.
dist-hook:
Index: debug.c
===================================================================
RCS file: /cvsroot/lustre/lustre/portals/libcfs/debug.c,v
retrieving revision 1.1.2.12
retrieving revision 1.1.2.13
diff -u -w -b -B -p -r1.1.2.12 -r1.1.2.13
--- debug.c 26 Sep 2003 03:59:09 -0000 1.1.2.12
+++ debug.c 30 Sep 2003 09:26:07 -0000 1.1.2.13
@@ -861,41 +861,61 @@ void portals_debug_set_level(unsigned in
portal_debug = debug_level;
}
+void portals_run_upcall(char **argv)
+{
+ int rc;
+ int argc;
+ char *envp[] = {
+ "HOME=/",
+ "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
+ NULL};
+ ENTRY;
+
+ argv[0] = portals_upcall;
+ argc = 1;
+ while (argv[argc] != NULL)
+ argc++;
+
+ LASSERT(argc >= 2);
+
+ rc = call_usermodehelper(argv[0], argv, envp);
+ if (rc < 0) {
+ CERROR("Error %d invoking portals upcall %s %s%s%s%s%s%s%s%s; "
+ "check /proc/sys/portals/upcall\n",
+ rc, argv[0], argv[1],
+ argc < 3 ? "" : ",", argc < 3 ? "" : argv[2],
+ argc < 4 ? "" : ",", argc < 4 ? "" : argv[3],
+ argc < 5 ? "" : ",", argc < 5 ? "" : argv[4],
+ argc < 6 ? "" : ",...");
+ } else {
+ CERROR("Invoked portals upcall %s %s%s%s%s%s%s%s%s\n",
+ argv[0], argv[1],
+ argc < 3 ? "" : ",", argc < 3 ? "" : argv[2],
+ argc < 4 ? "" : ",", argc < 4 ? "" : argv[3],
+ argc < 5 ? "" : ",", argc < 5 ? "" : argv[4],
+ argc < 6 ? "" : ",...");
+ }
+}
+
void portals_run_lbug_upcall(char *file, const char *fn, const int line)
{
char *argv[6];
- char *envp[3];
char buf[32];
- int rc;
ENTRY;
snprintf (buf, sizeof buf, "%d", line);
- argv[0] = portals_upcall;
argv[1] = "LBUG";
argv[2] = file;
argv[3] = (char *)fn;
argv[4] = buf;
argv[5] = NULL;
- envp[0] = "HOME=/";
- envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
- envp[2] = NULL;
-
- rc = USERMODEHELPER(argv[0], argv, envp);
- if (rc < 0) {
- CERROR("Error invoking lbug upcall %s %s %s %s %s: %d; check "
- "/proc/sys/portals/upcall\n",
- argv[0], argv[1], argv[2], argv[3], argv[4], rc);
-
- } else {
- CERROR("Invoked upcall %s %s %s %s %s\n",
- argv[0], argv[1], argv[2], argv[3], argv[4]);
+ portals_run_upcall (argv);
}
-}
-
EXPORT_SYMBOL(portals_debug_dumplog);
EXPORT_SYMBOL(portals_debug_msg);
EXPORT_SYMBOL(portals_debug_set_level);
+EXPORT_SYMBOL(portals_run_upcall);
EXPORT_SYMBOL(portals_run_lbug_upcall);
Index: module.c
===================================================================
RCS file: /cvsroot/lustre/lustre/portals/libcfs/module.c,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -w -b -B -p -r1.1.2.10 -r1.1.2.11
--- module.c 26 Sep 2003 03:59:09 -0000 1.1.2.10
+++ module.c 30 Sep 2003 09:26:07 -0000 1.1.2.11
@@ -122,8 +122,8 @@ static inline void freedata(void *data,
}
static int
-kportal_add_route(int gateway_nalid, ptl_nid_t gateway_nid, ptl_nid_t lo_nid,
- ptl_nid_t hi_nid)
+kportal_add_route(int gateway_nalid, ptl_nid_t gateway_nid,
+ ptl_nid_t lo_nid, ptl_nid_t hi_nid)
{
int rc;
kpr_control_interface_t *ci;
@@ -139,7 +139,8 @@ kportal_add_route(int gateway_nalid, ptl
}
static int
-kportal_del_route(ptl_nid_t target)
+kportal_del_route(int gw_nalid, ptl_nid_t gw_nid,
+ ptl_nid_t lo, ptl_nid_t hi)
{
int rc;
kpr_control_interface_t *ci;
@@ -148,7 +149,24 @@ kportal_del_route(ptl_nid_t target)
if (ci == NULL)
return (-ENODEV);
- rc = ci->kprci_del_route (target);
+ rc = ci->kprci_del_route (gw_nalid, gw_nid, lo, hi);
+
+ PORTAL_SYMBOL_PUT(kpr_control_interface);
+ return (rc);
+}
+
+static int
+kportal_notify_router (int gw_nalid, ptl_nid_t gw_nid,
+ int alive, time_t when)
+{
+ int rc;
+ kpr_control_interface_t *ci;
+
+ ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface);
+ if (ci == NULL)
+ return (-ENODEV);
+
+ rc = ci->kprci_notify (gw_nalid, gw_nid, alive, when);
PORTAL_SYMBOL_PUT(kpr_control_interface);
return (rc);
@@ -156,12 +174,13 @@ kportal_del_route(ptl_nid_t target)
static int
kportal_get_route(int index, __u32 *gateway_nalidp, ptl_nid_t *gateway_nidp,
- ptl_nid_t *lo_nidp, ptl_nid_t *hi_nidp)
+ ptl_nid_t *lo_nidp, ptl_nid_t *hi_nidp, int *alivep)
{
int gateway_nalid;
ptl_nid_t gateway_nid;
ptl_nid_t lo_nid;
ptl_nid_t hi_nid;
+ int alive;
int rc;
kpr_control_interface_t *ci;
@@ -169,17 +188,19 @@ kportal_get_route(int index, __u32 *gate
if (ci == NULL)
return (-ENODEV);
- rc = ci->kprci_get_route(index, &gateway_nalid, &gateway_nid, &lo_nid,
- &hi_nid);
+ rc = ci->kprci_get_route(index, &gateway_nalid, &gateway_nid,
+ &lo_nid, &hi_nid, &alive);
if (rc == 0) {
- CDEBUG(D_IOCTL, "got route [%d] %d "LPX64":"LPX64" - "LPX64"\n",
- index, gateway_nalid, gateway_nid, lo_nid, hi_nid);
+ CDEBUG(D_IOCTL, "got route [%d] %d "LPX64":"LPX64" - "LPX64", %s\n",
+ index, gateway_nalid, gateway_nid, lo_nid, hi_nid,
+ alive ? "up" : "down");
*gateway_nalidp = (__u32)gateway_nalid;
- *gateway_nidp = (__u32)gateway_nid;
- *lo_nidp = (__u32)lo_nid;
- *hi_nidp = (__u32)hi_nid;
+ *gateway_nidp = gateway_nid;
+ *lo_nidp = lo_nid;
+ *hi_nidp = hi_nid;
+ *alivep = alive;
}
PORTAL_SYMBOL_PUT (kpr_control_interface);
@@ -367,23 +388,38 @@ static int kportal_ioctl(struct inode *i
case IOC_PORTAL_ADD_ROUTE:
CDEBUG(D_IOCTL, "Adding route: [%d] "LPU64" : "LPU64" - "LPU64"\n",
- data->ioc_nal, data->ioc_nid, data->ioc_nid2,
- data->ioc_nid3);
+ data->ioc_nal, data->ioc_nid,
+ data->ioc_nid2, data->ioc_nid3);
err = kportal_add_route(data->ioc_nal, data->ioc_nid,
- MIN (data->ioc_nid2, data->ioc_nid3),
- MAX (data->ioc_nid2, data->ioc_nid3));
+ data->ioc_nid2, data->ioc_nid3);
break;
case IOC_PORTAL_DEL_ROUTE:
- CDEBUG (D_IOCTL, "Removing route to "LPU64"\n", data->ioc_nid);
- err = kportal_del_route (data->ioc_nid);
+ CDEBUG (D_IOCTL, "Removing routes via [%d] "LPU64" : "LPU64" - "LPU64"\n",
+ data->ioc_nal, data->ioc_nid,
+ data->ioc_nid2, data->ioc_nid3);
+ err = kportal_del_route (data->ioc_nal, data->ioc_nid,
+ data->ioc_nid2, data->ioc_nid3);
+ break;
+
+ case IOC_PORTAL_NOTIFY_ROUTER: {
+ CDEBUG (D_IOCTL, "Notifying peer [%d] "LPU64" %s @ %ld\n",
+ data->ioc_nal, data->ioc_nid,
+ data->ioc_flags ? "Enabling" : "Disabling",
+ (time_t)data->ioc_nid3);
+
+ err = kportal_notify_router (data->ioc_nal, data->ioc_nid,
+ data->ioc_flags,
+ (time_t)data->ioc_nid3);
break;
+ }
case IOC_PORTAL_GET_ROUTE:
CDEBUG (D_IOCTL, "Getting route [%d]\n", data->ioc_count);
err = kportal_get_route(data->ioc_count, &data->ioc_nal,
- &data->ioc_nid, &data->ioc_nid2,
- &data->ioc_nid3);
+ &data->ioc_nid,
+ &data->ioc_nid2, &data->ioc_nid3,
+ &data->ioc_flags);
if (err == 0)
if (copy_to_user((char *)arg, data, sizeof (*data)))
err = -EFAULT;
@@ -432,7 +468,27 @@ static int kportal_ioctl(struct inode *i
kportal_put_ni (data->ioc_nal);
break;
}
+#if LWT_SUPPORT
+ case IOC_PORTAL_LWT_CONTROL:
+ err = lwt_control (data->ioc_flags, data->ioc_misc);
+ break;
+
+ case IOC_PORTAL_LWT_SNAPSHOT:
+ err = lwt_snapshot (&data->ioc_count, &data->ioc_misc,
+ data->ioc_pbuf1, data->ioc_plen1);
+ if (err == 0 &&
+ copy_to_user((char *)arg, data, sizeof (*data)))
+ err = -EFAULT;
+ break;
+ case IOC_PORTAL_LWT_LOOKUP_STRING:
+ err = lwt_lookup_string (&data->ioc_count, data->ioc_pbuf1,
+ data->ioc_pbuf2, data->ioc_plen2);
+ if (err == 0 &&
+ copy_to_user((char *)arg, data, sizeof (*data)))
+ err = -EFAULT;
+ break;
+#endif
default:
err = -EINVAL;
break;
@@ -471,12 +527,19 @@ static int init_kportals_module(void)
return (rc);
}
+#if LWT_SUPPORT
+ rc = lwt_init();
+ if (rc != 0) {
+ CERROR("lwt_init: error %d\n", rc);
+ goto cleanup_debug;
+ }
+#endif
sema_init(&nal_cmd_sem, 1);
rc = misc_register(&portal_dev);
if (rc) {
CERROR("misc_register: error %d\n", rc);
- goto cleanup_debug;
+ goto cleanup_lwt;
}
rc = PtlInit();
@@ -498,6 +561,10 @@ static int init_kportals_module(void)
PtlFini();
cleanup_deregister:
misc_deregister(&portal_dev);
+ cleanup_lwt:
+#if LWT_SUPPORT
+ lwt_fini();
+#endif
cleanup_debug:
portals_debug_cleanup();
return rc;
@@ -517,6 +584,10 @@ static void exit_kportals_module(void)
rc = misc_deregister(&portal_dev);
if (rc)
CERROR("misc_deregister error %d\n", rc);
+
+#if LWT_SUPPORT
+ lwt_fini();
+#endif
if (atomic_read(&portal_kmemory) != 0)
CERROR("Portals memory leaked: %d bytes\n",
_______________________________________________
Lustre-cvs mailing list
Lustre-cvs@lists.clusterfs.com
https://lists.clusterfs.com/mailman/listinfo/lustre-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic